我想知道是否有可能有一个功能(有点类似于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
),但只是单独留下函数。
答案 0 :(得分:4)
不,当然不是。如果不评估这个论点怎么知道?
但是要直接解决您的问题X,您提议的myseq
比实际seq
更糟,因为它会破坏参数。 myseq undefined :: b -> b
底部还是身份?这取决于类型变量a
(undefined :: a
)是否使用函数类型进行实例化。
在Haskell中,当forall a.
根本没有出现在类型中时,您总是被允许放弃a
,这要归功于参数化:a
的选择无关紧要。您的myseq
会丢失该属性。
这也是为什么如果没有在运行时使用预期类型注释值而无法实现isFunction#
的原因(isFunction# undefined
同样毫无意义)。