有没有办法在运行时确定GHC中的抽象值是否为函数?

时间:2015-11-17 19:25:11

标签: haskell ghc

我想知道是否有可能有一个功能(有点类似于dataToTag#),如:

isFunction# :: a -> Bool

或可能等同于:

isFunction# :: Any -> Bool

返回True iff作为参数传入的值在某些类型a -> b的运行时属于a => b类型(或者,就此而言,a)和b,或newtype,其基础类型是(因此它"通过" newtype s,但当然不是data),而不强制它的论点。我自己GHC.Prim没有看到这样的事情,但我可能错过了一些东西,或者可能用手动的CMM primop或其他东西。

既然我已经想到了这个问题,我本人就这个答案感到好奇(question Y),但我想到的原因(问题X)是投诉通常是平稳的反对seq是因为它可以通过观察undefined\_ -> undefined之间的差异来打破eta等价,我想知道是否有可能制作{{1}的版本(seq)那仍然是神奇多态的" (有效myseq a = if isFunction# a then flip const a else seq a),但只是单独留下函数。

1 个答案:

答案 0 :(得分:4)

不,当然不是。如果不评估这个论点怎么知道?

但是要直接解决您的问题X,您提议的myseq比实际seq更糟,因为它会破坏参数。 myseq undefined :: b -> b底部还是身份?这取决于类型变量aundefined :: a)是否使用函数类型进行实例化。

在Haskell中,当forall a.根本没有出现在类型中时,您总是被允许放弃a,这要归功于参数化:a的选择无关紧要。您的myseq会丢失该属性。

这也是为什么如果没有在运行时使用预期类型注释值而无法实现isFunction#的原因(isFunction# undefined同样毫无意义)。