是否可以编写一个函数isFunc :: a -> Bool来确定任意值是否是一个函数(任何类型)
foo :: Int -> Int
bar :: Char -> Char -> Char
> isFunc foo
True
> isFunc bar
True
> isFunc 3
False
> isFunc 'a'
False
Run Code Online (Sandbox Code Playgroud)
我正在使用Data.Dynamic,所以我无法提前确定类型.
rkh*_*rov 11
你要求什么,你需要做什么Data.Dynamic似乎是不同的事情.在使用fromDyn/ 提取之前,您需要知道确切的值类型fromDynamic.要确定是否Dynamic包含需要分析的函数值TypeRep:
isFuncDynamic x = typeRepTyCon (dynTypeRep x) == typeRepTyCon (typeOf2 id)
Run Code Online (Sandbox Code Playgroud)
(如果这不是最简洁的实现,请原谅我.)
pig*_*ker 10
参数化说没有.类型的唯一功能
a -> Bool
Run Code Online (Sandbox Code Playgroud)
是不变的功能.
但是,通过一些特殊的多态性和更多的chutzpah,你可以这样做:
{-# LANGUAGE OverlappingInstances, FlexibleInstances #-}
class Sick x where
isFunc :: x -> Bool
instance Sick (a -> b) where
isFunc _ = True
instance Sick x where
isFunc _ = False
Run Code Online (Sandbox Code Playgroud)
然后它看起来像你有
*Sick> isFunc 3
False
*Sick> isFunc id
True
Run Code Online (Sandbox Code Playgroud)
但这似乎是一件特别的事情.结果有什么用Bool?