Haskell 的类型系统将数值视为函数?
在玩了一下 haskell 后,我偶然发现了这个函数:
Prelude Data.Maclaurin> :t ((+) . ($) . (+))
((+) . ($) . (+)) :: (Num a) => a -> (a -> a) -> a -> a
(Data.Maclaurin 由包向量空间导出。)所以它需要一个 Num、一个函数、另一个 Num 并最终返回一个 Num。是什么魔力让下面的工作得以实现?
Prelude Data.Maclaurin> ((+) . ($) . (+)) 1 2 3
6
2 显然不是一个函数(a->a)或者我错过了什么?
After playing around with haskell a bit I stumbled over this function:
Prelude Data.Maclaurin> :t ((+) . ($) . (+))
((+) . ($) . (+)) :: (Num a) => a -> (a -> a) -> a -> a
(Data.Maclaurin is exported by the package vector-space.) So it takes a Num, a function, another Num and ultimately returns a Num. What magic makes the following work?
Prelude Data.Maclaurin> ((+) . ($) . (+)) 1 2 3
6
2 is obviously not a function (a->a) or did I miss out on something?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
同一包的 Data.NumInstances
模块 为返回数字的函数定义一个Num
实例:在Haskell中,像
2 是通用的,因此它可以表示
Num
的任何实例的数字:要将其转换为特定上下文中所需类型的实际数字,请使用
fromInteger
code>Num 类被调用。由于上面提到的辅助模块为函数定义了
Num
实例,因此现在可以使用fromInteger< 将
2
转换为函数 /code> 那里指定的方法。因此 ghci 调用
fromInteger 2
来获取问题中构造的第二个参数所需的函数。然后整个表达式的计算结果恰好为6
。The
Data.NumInstances
module of the same package defines aNum
instance for functions that return numbers:In Haskell an integer literal like
2
is generic so that it can represent a number for any instance ofNum
:To convert it to an actual number of the type required in a specific context,
fromInteger
from theNum
class is called.Since the helper module mentioned above defines an instance of
Num
for functions,2
can now be converted to a function with thefromInteger
method specified there.So ghci calls
fromInteger 2
to get the function required as the second parameter of the construct in the question. The whole expression then happens to evaluate to6
.你有充分的理由感到困惑。使用 GHC 中的 Data.NumInstances 模块(由 Data.Maclaurin 加载)可以将 Num 强制为常量函数。
表达式的求值本质上是:
You have good reason to be confused. Using the
Data.NumInstances
module in GHC (which is loaded byData.Maclaurin
) it is possible to coerce aNum
to a constant function.The evaluation of the expression is, essentially,