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

标签 haskell ghc

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

isFunction# :: a -> Bool

或可能等效地:
isFunction# :: Any -> Bool

返回 True如果作为参数传入的值是 a -> b 类型(或者,就此而言, a => b )在运行时对于某些类型 ab , 或 newtype其基础类型是(因此它“看穿” newtype s,但当然不是 data ),而不强制其论点。我在 GHC.Prim 中没有看到类似的内容我自己,但我可能错过了一些东西,或者可能使用手动 CMM primop 或其他东西。

既然我想到了这个问题,我就对答案本身感到好奇(question 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.a由于参数化,根本没有出现在类型中:a 的选择没关系。您的 myseq将失去该属性(property)。

这也是您无法实现 isFunction# 的原因。没有在运行时用它们的预期类型注释值(isFunction# undefined 同样没有意义)。

关于haskell - 有没有办法在运行时在 GHC 中确定抽象值是否是函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33765355/

相关文章:

Haskell 箭头延迟函数

haskell - 为什么 ContT 不处理内部单子(monad)?

list - 如何修改嵌套自定义数据类型中的列表值?

haskell - Data.Vector.Mixed 的用途

java - 如何在 Java 中模拟 Haskell 的 "Either a b"

haskell - 如何将环境变量传递给通过堆栈运行的 Haskell 程序?

haskell - Haskell/GHC 的类似 Python -"is"的等式运算符

haskell - 是否可以在没有 prof 库的情况下分析 Haskell 程序?

haskell - C 与 Haskell 中的朴素斐波那契

haskell - 有谁知道(或记得)违反类(Class)法会如何导致 GHC 出现问题?