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

gla*_*erl 6 haskell ghc

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

isFunction# :: a -> Bool
Run Code Online (Sandbox Code Playgroud)

或者可能等同于:

isFunction# :: Any -> Bool
Run Code Online (Sandbox Code Playgroud)

它返回TrueIFF传递作为参数是一种类型的值a -> b(或者,对于这个问题,a => b在运行时)对某些类型的ab,或newtype它的基本类型是(所以它"通过看见" newtypeS,但当然不是data),没有强迫它的论点.我在GHC.Prim自己没有看到这样的东西,但我可能已经错过了一些东西,或者可能用手动的CMM primop或其他东西.

既然问题已经发生在我身上,我对答案本身就很好奇(问题Y),但我想到的最初的原因(问题X)是,通常针对的seq是,它通过以下方式打破eta等值:从而可以观察之间的差异undefined\_ -> undefined,我想知道是否有可能使一个版本的seq(myseq a = if isFunction# a then flip const a else seq a),这仍然是"神奇的多态性"(工作forall a),而只是独自离开的功能.

Rei*_*ton 4

不,当然不是。如果不评估论证,它怎么可能知道呢?

但为了直接解决你的问题 X,你的提议myseq比实际的更糟糕seq,因为它破坏了参数性。是myseq undefined :: b -> b底线,还是身份?这取决于类型变量a( undefined :: a) 是否用函数类型实例化。

在 Haskell 中,由于参数性,您总是可以删除根本没有出现在类型中的forall a.when a: 的选择a并不重要。您myseq将失去该财产。

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