3

我必须指定 2 个函数的类型(不使用编译器:t)我只是不知道我是如何阅读这些函数以做出正确的步骤的。

f x = map -1 x
f x = map (-1) x

好吧,我有点困惑如何解析它

4

4 回答 4

4

函数应用程序或“空格运算符”的优先级高于任何运算符符号,因此第一行解析为1f x = map - (1 x),这很可能是类型错误。

另一个例子是用括号括起来的,但请注意,(-1)脱糖为negate 1. 这是正常规则的一个例外,其中像(+1)desugar as这样的运算符部分(\x -> x + 1),因此这也可能是1类型错误map,因为它的第一个参数是函数,而不是数字。

1我说可能是因为从技术上讲Num,可以为允许进行类型检查的函数提供实例。

于 2012-05-06T20:39:57.333 回答
3

对于这样的问题,确定的答案是查看Haskell 报告。Haskell 98 中的相关语法没有改变。

特别是,检查“表达式”部分。这应该解释如何解析表达式、运算符优先级等。

于 2012-05-06T20:33:14.773 回答
2

这些函数没有类型,因为它们没有类型检查(你会得到可笑的类型类约束)。要弄清楚原因,您需要知道它 (-1)有 type Num n => n,并且您需要阅读如何在 a-之前使用或不使用 parens 来解释它。

以下函数是您的函数的“正确”版本:

f x = map (subtract 1) x

如果我这样说,您应该能够弄清楚这个函数的类型:

subtract 1 :: Num n => n -> n
map :: (a -> b) -> [a] -> [b]
于 2012-05-06T20:38:28.060 回答
0

好吧,我是自己做的: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]
于 2012-05-08T11:04:54.770 回答