我必须指定 2 个函数的类型(不使用编译器:t)我只是不知道我是如何阅读这些函数以做出正确的步骤的。
f x = map -1 x
f x = map (-1) x
好吧,我有点困惑如何解析它
我必须指定 2 个函数的类型(不使用编译器:t)我只是不知道我是如何阅读这些函数以做出正确的步骤的。
f x = map -1 x
f x = map (-1) x
好吧,我有点困惑如何解析它
函数应用程序或“空格运算符”的优先级高于任何运算符符号,因此第一行解析为1f x = map - (1 x)
,这很可能是类型错误。
另一个例子是用括号括起来的,但请注意,(-1)
脱糖为negate 1
. 这是正常规则的一个例外,其中像(+1)
desugar as这样的运算符部分(\x -> x + 1)
,因此这也可能是1类型错误map
,因为它的第一个参数是函数,而不是数字。
1我说可能是因为从技术上讲Num
,可以为允许进行类型检查的函数提供实例。
对于这样的问题,确定的答案是查看Haskell 报告。Haskell 98 中的相关语法没有改变。
特别是,检查“表达式”部分。这应该解释如何解析表达式、运算符优先级等。
这些函数没有类型,因为它们没有类型检查(你会得到可笑的类型类约束)。要弄清楚原因,您需要知道它 (-1)
有 type Num n => n
,并且您需要阅读如何在 a-
之前使用或不使用 parens 来解释它。
以下函数是您的函数的“正确”版本:
f x = map (subtract 1) x
如果我这样说,您应该能够弄清楚这个函数的类型:
subtract 1 :: Num n => n -> n
map :: (a -> b) -> [a] -> [b]
好吧,我是自己做的:P
(map) - (1 x)
(-)::Num a => a->a->->a
1::Num b=> b
x::e
map::(c->d)->[c]->[d]
map::a
a\(c->d)->[c]->[d]
(1 x)::a
1::e->a
f::(Num ((c->d)->[c]->[d]),Num (e->(c->d)->[c]->[d])) => e->(c->d)->[c]->[d]