【问题标题】:Determine whether a value is a function in Haskell判断一个值是否是 Haskell 中的函数
【发布时间】:2012-04-21 11:26:56
【问题描述】:

是否可以编写一个函数isFunc :: a -> Bool 来确定任意值是否是(任何类型的)函数,使得

foo :: Int -> Int
bar :: Char -> Char -> Char    

> isFunc foo
True
> isFunc bar
True
> isFunc 3
False
> isFunc 'a'
False

我使用的是Data.Dynamic,所以无法提前确定类型。

【问题讨论】:

  • isFunc 在存在多态性的情况下不是一个格式正确的问题。我有一个a 类型的东西;它是一个功能吗?在我将a 转换为单态类型之前,答案是不确定的,因为在那之前我可以选择a ~ Inta ~ Int -> Int。您的isFunc 3 示例正是有这个问题,您可能甚至没有注意到;你怎么知道3 不是函数?

标签: haskell typeinfo


【解决方案1】:

您要求什么以及您需要对Data.Dynamic 做什么似乎是不同的事情。在使用fromDyn/fromDynamic 提取值之前,您需要知道它的确切类型。判断Dynamic是否包含函数值需要分析TypeRep

isFuncDynamic x = typeRepTyCon (dynTypeRep x) == typeRepTyCon (typeOf2 id)

(如果这不是最简洁的实现,请原谅我。)

【讨论】:

  • 谢谢。这个函数(虽然是手动构建的)正是我想要的。
【解决方案2】:

参数化说不。类型的唯一函数

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 应用于那些函数。
  • 我不相信这种方法真的可以解决这个问题——或者坦率地说,在 Haskell 中,any 方法可以解决这个问题。 Haskell 中的类型类实例总是在编译时解析,而不是运行时解析,而且您描述的情况似乎需要运行时解析。
猜你喜欢
  • 1970-01-01
  • 2023-01-28
  • 2014-12-27
  • 2021-02-09
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
相关资源
最近更新 更多