Haskell:“泛型”类型的表达式

Haskell:“泛型”类型的表达式,haskell,types,type-inference,variable-types,Haskell,Types,Type Inference,Variable Types,在中所示的类似问题中,是否可能有泛型a的Haskell表达式?大概 myExpression::a 我是哈斯克尔的新手,但从我所看到的来看,这是不可能实现的。不,除了底部,没有什么能满足这一点,例如 myExpression = myExpression -- or, myExpression = undefined 有什么合理的方法可以做到这一点吗?例如,一些既为整数又为String->IO类型的非底部表达式 此外,给出了一个答案,证明了类型签名为a->a的唯一非底函数是id,我们证明了

在中所示的类似问题中,是否可能有泛型a的Haskell表达式?大概

myExpression::a


我是哈斯克尔的新手,但从我所看到的来看,这是不可能实现的。

不,除了底部,没有什么能满足这一点,例如

myExpression = myExpression

-- or,

myExpression = undefined
有什么合理的方法可以做到这一点吗?例如,一些既为整数又为String->IO类型的非底部表达式

此外,给出了一个答案,证明了类型签名为a->a的唯一非底函数是id,我们证明了不可能存在类型为a的非底表达式。如果有,那么

f _ = myExpression

可以有类型a->a,这既不是id也不是底部,即矛盾。

您可以读取该类型签名,因为对于所有类型a,myExpression都是类型a。这意味着myExpression必须是存在于所有类型中的某个值

从数学上讲,不存在这样的值,因为a可能是獾或不是獾的东西,这两个集合必然是不同的


在Haskell类型系统中,myExpression要采用的唯一有效值是未定义的,即bottom。

虽然抽象地说只有一个值具有类型a bottom,但在运行时有多种可能的解释

myExpression = myExpression
这永远不会结束

myExpression = undefined
这将在使用GHC打印*时发生异常:Prelude.undefined

myExpression = error "Hello!
这将打印*例外:您好

myExpression = unsafePerformIO (launchNukes >> fail "BOOM")
此版本的bottom的行为取决于您导入的库


因为您询问的是泛型类型,所以您可能指的是可以有效地包含任何值的类型。在这种情况下,请看,它允许您将内存中表示的任何内容转换为Dynamic类型的值。稍后,当使用Dynamic类型的值时,您可以尝试将其转换为更具体的类型,以便实际使用。

值得指出的是,虽然将其转换为Dynamic并再次转换为Dynamic类型是可能的,但这远远不可取,尤其是对于初学者@acrespo:type a代表你喜欢的任何类型,因此如果你有一个函数a->Bool,你可以在任何东西上使用它,但是如果它是Num a=>a->Bool类型,你可以在任何数字类型上使用它。因此,a表示您喜欢的任何类型-您不需要找到a类型的东西来使用此函数。一定要好好学习“学习Haskell”的“类型和类型类”一章。更好的问题可能是你为什么要这样做?它在面向对象的语言中可能很有用,但在Haskell中它一点用处都没有。当时我只是好奇这是否可以实现,但现在我可以真正开始看到底部表达式的用处,以及它与部分函数、严格函数和非严格函数以及求值策略的关系。