确定值是否是Haskell中的函数
是否可以编写一个函数确定值是否是Haskell中的函数,haskell,typeinfo,Haskell,Typeinfo,是否可以编写一个函数isFunc::a->Bool,以确定任意值是否是(任何类型的)函数,从而 foo :: Int -> Int bar :: Char -> Char -> Char > isFunc foo True > isFunc bar True > isFunc 3 False > isFunc 'a' False 我正在使用,因此我无法提前确定类型。参数设置表示否。类型的唯一函数 a -> Bool 是常数函数 但是,
isFunc::a->Bool
,以确定任意值是否是(任何类型的)函数,从而
foo :: Int -> Int
bar :: Char -> Char -> Char
> isFunc foo
True
> isFunc bar
True
> isFunc 3
False
> isFunc 'a'
False
我正在使用,因此我无法提前确定类型。参数设置表示否。类型的唯一函数
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
对您有什么用?您要求什么,需要对数据做什么。动态似乎是不同的事情。在使用fromDyn
/fromDynamic
提取值之前,您需要知道值的确切类型。要确定Dynamic
是否包含函数值,需要分析TypeRep
:
isFuncDynamic x = typeRepTyCon (dynTypeRep x) == typeRepTyCon (typeOf2 id)
(如果这不是最简洁的实现,请原谅。)我正在映射一个动态类型值列表,并将x应用于那些函数。我不相信这种方法真的能解决这个问题——或者说,坦白说,在Haskell中,任何方法都能解决这个问题。Haskell中的Typeclass实例总是在编译时解析,而不是在运行时解析,您描述的情况似乎需要运行时解析。谢谢。这个函数(尽管是手动构造的)正是我想要的。isFunc
在存在多态性的情况下,不是一个结构良好的问题。我有一件a型的东西;它是不是一个函数?在我将a
转换为单态类型之前,答案是不确定的,因为在此之前,我可以选择a~Int
或a~Int->Int
。您的isFunc 3
示例正好有这个问题,您可能甚至没有注意到;你怎么知道3
不是函数?