gpt4 book ai didi

Haskell 的类型系统将数值视为函数?

转载 作者:行者123 更新时间:2023-12-04 13:18:04 25 4
gpt4 key购买 nike

在玩了一下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) 还是我错过了什么?

最佳答案

Data.NumInstances 同包模块defines一个 Num返回数字的函数的实例:

instance Num b => Num (a->b) where
(+) = liftA2 (+)
(*) = liftA2 (*)
fromInteger = pure . fromInteger
...

在 Haskell 中,整数文字如 2是通用的,因此它可以表示 Num 的任何实例的数字:
Prelude> :t 2
2 :: (Num t) => t

要将其转换为特定上下文所需类型的实际数字, fromInteger来自 Num类被调用。

由于上面提到的帮助模块定义了 Num 的实例。对于函数, 2现在可以使用 fromInteger 转换为函数那里指定的方法。
所以 ghci 调用 fromInteger 2获取作为问题中构造的第二个参数所需的函数。然后整个表达式恰好计算为 6 .

关于Haskell 的类型系统将数值视为函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2496457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com