function - Haskell 中的别名函数

标签 function haskell

以下代码无法编译:

import Data.Bits
xor2 = xor

但是,一旦我添加了类型信息,它就会编译:

import Data.Bits
xor2 :: Bits a => a->a->a
xor2 = xor

我无法解释这一点。有什么解释吗?

最佳答案

这是 dreaded monomorphism restriction 的问题(MMR),默认启用。 MMR 是一条规则,强制看起来不像函数的顶级绑定(bind)(即 x = ...x a = ...)具有单态绑定(bind),除非它们具有显式的多态类型签名。

问题在于Bits a => a -> a -> a是多态的(注意类型变量a),Haskell不知道如何选择满足 Bits 约束的 a 的默认类型。

添加类型签名后,MMR 就会得到缓解,您就可以拥有多态的顶级绑定(bind)。另一种选择是通过添加命名参数来“eta 扩展”定义;由于 xor2 现在在语法上看起来像一个函数,因此 MMR 不适用:

xor2 x = xor x

您还可以使用语言扩展关闭 MMR。您可以将其放在模块的顶部:

{-# LANGUAGE NoMonomorphismRestriction #-}

关于function - Haskell 中的别名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28245328/

相关文章:

list - Haskell 无限递归

haskell - StateT 与 ReaderT IORef 的异常处理

c - 从 C 中的另一个函数打印数组

php - __construct 和与类同名的函数有什么区别?

shell - 是否可以使用 Heredoc 将参数传递给 `runhaskell`?

haskell - 为什么这个实现无效?

haskell - 使用 WinGHCi 解析预制代码时出现错误

javascript - 让主函数调用较小的函数?

c - 函数不显示返回值?

php - 根据用户点击更改文件名