gpt4 book ai didi

haskell - has kind 'Constraint' 在 Haskell 中意味着什么

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

我对 Haskell 很陌生,我正在尝试通过编写一些代码来理解该语言。我只熟悉 ghci 上非常简单的指令:head、tail、sum、(*) 等 – 非常简单。

我试图创建的函数是为了求解任意维向量的毕达哥拉斯定理。看起来像这样:平方根 (a^2 + b^2 + c^2 ...)

我可以用几行代码在 ghci 中执行以下操作,我正在尝试创建一个函数:

sq x = x*x

b = map sq [1,2,3]

a = sum b

x = sqrt b

当我这样做时,我尝试包含多种签名,目前我的函数如下所示:

mod :: [Num a] => a
mod x = sqrt a
where a = sum [b]
where [b] = map sq [x]

当我尝试运行它时,我不明白这个问题:

Expected a constraint, but ‘[Num a]’ has kind ‘*’
• In the type signature:
Main.mod :: [Num a] => a

最佳答案

需要调整的一些事项:

0) mod 对于您的函数来说不是一个好名称,因为它是标准库中模函数的名称。我将其称为norm

1)您要编写的类型签名是:

norm :: Num a => [a] -> a

[a] 是包含 a 类型元素的列表类型。 => 之前的 Num a 不是类型,而是一个约束,它指定 a 必须是数字类型(或者更准确地说,它必须是 Num 类的实例)。 [Num a] => 会导致您看到的错误,因为给定方括号,类型检查器将其视为尝试使用列表类型而不是约束。

除了 Num a 问题之外,您还忽略了签名中的结果类型。更正后的签名反射(reflect)您的函数采用数字列表并返回一个数字。

2) Num a 约束对于您想要执行的操作来说太弱。为了使用 sqrt,您不仅需要一个数字类型,而且需要一个 Floating 实例(参见 leftaroundabout 对此答案的评论):

GHCi> :t sqrt
sqrt :: Floating a => a -> a

因此,您的签名应该是

norm :: Floating a => [a] -> a

3) [x] 是一个包含单个元素 x 的列表。如果您的参数已经是一个列表,如类型签名所示,则无需将其括在方括号中。那么你的函数就变成了:

norm :: Floating a => [a] -> a
norm x = sqrt a
where a = sum b
where b = map sq x

或者,更简洁地,没有第二个 where-block:

norm :: Floating a => [a] -> a
norm x = sqrt (sum b)
where b = map sq x

关于haskell - has kind 'Constraint' 在 Haskell 中意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41121107/

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