我想知道是否有可能有一个功能(有点类似dataToTag#
):
isFunction# :: a -> Bool
Run Code Online (Sandbox Code Playgroud)
或者可能等同于:
isFunction# :: Any -> Bool
Run Code Online (Sandbox Code Playgroud)
它返回True
IFF传递作为参数是一种类型的值a -> b
(或者,对于这个问题,a => b
在运行时)对某些类型的a
和b
,或newtype
它的基本类型是(所以它"通过看见" newtype
S,但当然不是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
),而只是独自离开的功能.
不,当然不是。如果不评估论证,它怎么可能知道呢?
但为了直接解决你的问题 X,你的提议myseq
比实际的更糟糕seq
,因为它破坏了参数性。是myseq undefined :: b -> b
底线,还是身份?这取决于类型变量a
( undefined :: a
) 是否用函数类型实例化。
在 Haskell 中,由于参数性,您总是可以删除根本没有出现在类型中的forall a.
when a
: 的选择a
并不重要。您myseq
将失去该财产。
这也是为什么如果isFunction#
不在运行时用预期类型注释值就无法实现的原因(isFunction# undefined
同样没有意义)。
归档时间: |
|
查看次数: |
99 次 |
最近记录: |