有几点需要调整:
0) mod
对于您的函数来说不是一个好名称,因为它是标准库中的模函数的名称。我会称之为norm
反而。
1)您要写的类型签名是:
norm :: Num a => [a] -> a
[a]
是包含 type 元素的列表的类型a
. The Num a
之前=>
不是一个类型,而是一个约束,它指定a
必须是数字类型(或者更准确地说,它必须是Num
班级)。[Num a] =>
导致您看到的错误,因为给定方括号,类型检查器将其视为尝试使用列表类型而不是约束。
超过Num a
问题,您在签名中遗漏了结果类型。更正后的签名反映了您的函数采用数字列表并返回一个数字。
2) The 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