gpt4 book ai didi

haskell - GHCi 如何为类型变量选择名称?

转载 作者:行者123 更新时间:2023-12-02 11:43:43 25 4
gpt4 key购买 nike

使用交互式 GHC 解释器时,可以询问表达式的推断类型:

Prelude> :t map
map :: (a -> b) -> [a] -> [b]

它似乎从签名中获取类型变量的名称,因为 mapdefined作为

map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs

在前奏曲中。这很有道理!我的问题是:在没有给出签名的情况下如何选择类型变量名称?

一个例子是

Prelude> :t map fst
map fst :: [(b, b1)] -> [b]

它选择了名称bb1。很明显,必须进行重命名,但简单地以 ab、... 开头就会给出

map fst :: [(a, b)] -> [a]

相反,我发现它更具可读性。

最佳答案

据我了解,ghci 按照推断类型的顺序选择名称。它使用您提到的命名方案来决定结果的类型名称,即[b],因为这是map 定义中指定的类型名称。然后,它决定作为 map 的第一个参数的函数也应该返回 b 类型的内容。

要命名的剩余类型变量是 fst 参数元组中第二个元素的类型变量,并且再次查看 fst 的定义来决定使用哪个名称。 fst::(a, b) -> a 的定义,因此 b 将是此处的首选名称,但由于 b 已经是采取后,它会附加一个1,使其成为b1

我认为这个系统在您不处理任意类型的情况下具有优势,就像这里的情况一样。如果结果类型看起来像这样,例如:

castAdd :: (Num n, Num n1, Num n2) => n -> n1 -> n2

...可以说它比以下内容更具可读性:

castAdd :: (Num a, Num b, Num c) => a -> b -> c

...因为您主要可以相信 n# 表示数字类型,因为 Num 的类定义是 class Num n where .. ..

编辑:是的,我知道 castAdd 不可能实现,但这只是一个类型示例。

关于haskell - GHCi 如何为类型变量选择名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8519964/

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