gpt4 book ai didi

Haskell 类型长度 + 1

转载 作者:行者123 更新时间:2023-12-04 02:28:32 24 4
gpt4 key购买 nike

谁能帮我解释一下长度+1的类型
我尝试使用以下命令输入 ghci :t length + 1它返回 Num([a]->Int)=>[a]->Int这是什么意思?
谢谢

最佳答案

查看+的类型:

> :t (+)
(+) :: Num a => a -> a -> a

所以两个参数必须来自 Num 的同一个实例。 ,它返回其中之一。然后看 length的类型:
> :t length
length :: [b] -> Int

(请注意,我在这里改为使用 b 作为类型变量,但它并没有改变含义)。

所以如果你有 length + something ,然后 length必须具有实现 Num 的类型.由于 length的类型已经设置为 [b] -> Int ,这意味着 [b] -> Int需要是 Num 的实例, 和 something必须具有相同的类型。由于 Haskell 中的数字文字是多态的,这意味着 1可以只有 Num a => a 类型,并且可以根据上下文选择精确的实例。因为在表达式 length + 1 , + 的两个参数必须具有相同的类型,这意味着 1必须与 length 具有相同的类型,这意味着如果我们明确地写出所有类型,我们就会有类似的东西
((+) :: Num ([b] -> Int) => ([b] -> Int) -> ([b] -> Int) -> ([b] -> Int))
(length :: [b] -> Int)
(1 :: [b] -> Int)

(以前缀形式编写并拆分为多行,以便我们实际阅读它)。

所以基本上,这是说为了给 length 添加一些东西,您必须首先定义 Num 的实例对于 length的类型。 [b] -> Int 的返回类型只是说它返回与 length 相同类型的东西.

这有用吗?不,几乎可以肯定不是。这是 Haskell 类型系统的一个特性,你可以编写有趣而奇怪的 Num 实例。对于任何类型,但这并不意味着 Num 的实例因为每种类型都是有用的,可以以智能方式定义,甚至可以在不诉诸 undefined 的情况下进行定义.

我们可以为 Num 编写一个实例对于这种类型,但我会选择将其写入 newtype因为它可以让我们避免语言扩展。
newtype Silly a = Silly { unSilly :: [a] -> Int }

instance Num (Silly a) where
fromInteger x = Silly $ const (fromInteger x)
Silly f + Silly g = Silly $ \l -> f l + g l
Silly f * Silly g = Silly $ \l -> f l * g l
negate (Silly f) = Silly $ negate . f
abs (Silly f) = Silly $ abs . f
signum (Silly f) = Silly $ signum . f

然后我们可以将其用作
> (unSilly $ Silly length + 1) [1, 2, 3]
4
> (unSilly $ Silly length * Silly length) [1, 2, 3, 4]
16
> (unSilly $ negate $ Silly length) [1, 2, 3]
-3

但这并不是真的有用,它增加了相当多的样板来做相当于
> length [1, 2, 3] + 1
4
> length [1, 2, 3, 4] * length [1, 2, 3, 4]
16
> negate $ length [1, 2, 3]
-3

尽管在某些示例中有点酷:
> (unSilly $ Silly head + Silly last) [10, 0, 1, 2, 3, 4, 5]
15

但这仅适用于 [Int] 类型的列表.

关于Haskell 类型长度 + 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25706348/

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