3

私は2つの関数のタイプを指定する必要があります(コンパイラ:tを使用せずに)私は正しい手順を実行するためにこれらの関数をどのように読んだかわかりません。

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

さて、私はそれがどのように解析されるか少し混乱しています

4

4 に答える 4

4

関数適用、つまり「空のスペース演算子」はどの演算子記号よりも優先順位が高いため、最初の行はとして解析されます。f x = map - (1 x)これはおそらく1が型エラーです。

他の例は見た目が括弧で囲まれていますが、(-1)脱糖はとして注意してくださいnegate 1(+1)これは、 desugar asのような演算子セクションがある通常のルールの例外です。したがって、最初の引数として数値ではなく関数を期待するため、これも型エラーになる(\x -> x + 1)可能性があります。map

1おそらく、これがタイプチェックを可能にする可能性のある関数のインスタンスを提供することが技術的に可能であるためだと思います。Num

于 2012-05-06T20:39:57.333 に答える
3

このような質問の場合、決定的な答えはHaskellレポートを確認することです。関連する構文はHaskell98から変更されていません。

特に、「表現」のセクションを確認してください。これで、式の解析方法、演算子の優先順位などが説明されます。

于 2012-05-06T20:33:14.773 に答える
2

これらの関数は型チェックを行わないため、型はありません(ばかげた型クラスの制約が発生します)。(-1)理由を理解するには、それがタイプを持っていることを知る必要があり、その 前に、親の有無にかかわらずNum n => n、aがどのように-解釈されるかを読む必要があります。

次の関数は、関数の「正しい」バージョンです。

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 に答える