2012-04-21 38 views
8

是否可以編寫一個函數isFunc :: a -> Bool確定的任意值是否是一個函數(任何種類的),使得確定一個值是否在Haskell的函數

foo :: Int -> Int 
bar :: Char -> Char -> Char  

> isFunc foo 
True 
> isFunc bar 
True 
> isFunc 3 
False 
> isFunc 'a' 
False 

我使用Data.Dynamic所以我無法預先確定類型。

+3

'isFunc'不是一個結構良好的問題要問在多態性的存在下。我有一個'a'類型的東西;這是一個函數嗎?答案是不確定的,直到我已經變成了''到一個單態類型,因爲在那之前我可以選擇,例如,'一〜Int'或'一個〜詮釋 - > Int'。你的'isFunc 3'例子正是這個問題,你可能沒有注意到;你怎麼知道'3'不是一個函數? – 2012-04-21 15:58:40

回答

10

參數性說不。

a -> Bool 

的唯一功能是常量函數。

然而,有位特設多態的和更有點放肆,你可以這樣做:

{-# LANGUAGE OverlappingInstances, FlexibleInstances #-} 

class Sick x where 
    isFunc :: x -> Bool 

instance Sick (a -> b) where 
    isFunc _ = True 

instance Sick x where 
    isFunc _ = False 

,然後它看起來像你有

*Sick> isFunc 3 
False 
*Sick> isFunc id 
True 

但它似乎像一件奇特的事情要做。對你造成的Bool有什麼用?

+0

我映射過動態類型的值的列表以及將x到那些功能。 – jhibberd 2012-04-21 11:55:36

+1

我不相信這種做法實際上對這個問題的工作 - 或者,坦率地說,_any_方法將爲該問題的工作,在Haskell。類型類哈斯克爾實例總是解決在編譯時,不運行時,你所描述的情況似乎需要運行時的分辨率。 – 2012-04-21 17:43:22

11

什麼是你要求,你需要用Data.Dynamic做什麼似乎是不同的東西。在使用fromDyn/fromDynamic進行提取之前,您需要知道確切的價值類型。爲了確定Dynamic是否包含你需要分析TypeRep一個函數值:

isFuncDynamic x = typeRepTyCon (dynTypeRep x) == typeRepTyCon (typeOf2 id) 

(原諒我,如果這是不是最簡潔的方式。)

+0

謝謝。這個功能(儘管手動構建)正是我所期待的。 – jhibberd 2012-04-21 15:13:06

相關問題