是否可以編寫一個函數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所以我無法預先確定類型。
是否可以編寫一個函數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所以我無法預先確定類型。
參數性說不。
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
有什麼用?
我映射過動態類型的值的列表以及將x到那些功能。 – jhibberd 2012-04-21 11:55:36
我不相信這種做法實際上對這個問題的工作 - 或者,坦率地說,_any_方法將爲該問題的工作,在Haskell。類型類哈斯克爾實例總是解決在編譯時,不運行時,你所描述的情況似乎需要運行時的分辨率。 – 2012-04-21 17:43:22
什麼是你要求,你需要用Data.Dynamic
做什麼似乎是不同的東西。在使用fromDyn
/fromDynamic
進行提取之前,您需要知道確切的價值類型。爲了確定Dynamic
是否包含你需要分析TypeRep
一個函數值:
isFuncDynamic x = typeRepTyCon (dynTypeRep x) == typeRepTyCon (typeOf2 id)
(原諒我,如果這是不是最簡潔的方式。)
謝謝。這個功能(儘管手動構建)正是我所期待的。 – jhibberd 2012-04-21 15:13:06
'isFunc'不是一個結構良好的問題要問在多態性的存在下。我有一個'a'類型的東西;這是一個函數嗎?答案是不確定的,直到我已經變成了''到一個單態類型,因爲在那之前我可以選擇,例如,'一〜Int'或'一個〜詮釋 - > Int'。你的'isFunc 3'例子正是這個問題,你可能沒有注意到;你怎麼知道'3'不是一個函數? – 2012-04-21 15:58:40