确定值是否是Haskell中的函数

jhi*_*erd 8 haskell typeinfo

是否可以编写一个函数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