确定值是否是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
不是函数?