私は2つの関数のタイプを指定する必要があります(コンパイラ:tを使用せずに)私は正しい手順を実行するためにこれらの関数をどのように読んだかわかりません。
f x = map -1 x
f x = map (-1) x
さて、私はそれがどのように解析されるか少し混乱しています
私は2つの関数のタイプを指定する必要があります(コンパイラ:tを使用せずに)私は正しい手順を実行するためにこれらの関数をどのように読んだかわかりません。
f x = map -1 x
f x = map (-1) x
さて、私はそれがどのように解析されるか少し混乱しています
関数適用、つまり「空のスペース演算子」はどの演算子記号よりも優先順位が高いため、最初の行はとして解析されます。f x = map - (1 x)
これはおそらく1が型エラーです。
他の例は見た目が括弧で囲まれていますが、(-1)
脱糖はとして注意してくださいnegate 1
。(+1)
これは、 desugar asのような演算子セクションがある通常のルールの例外です。したがって、最初の引数として数値ではなく関数を期待するため、これも型エラーになる(\x -> x + 1)
可能性があります。map
1おそらく、これがタイプチェックを可能にする可能性のある関数のインスタンスを提供することが技術的に可能であるためだと思います。Num
このような質問の場合、決定的な答えはHaskellレポートを確認することです。関連する構文はHaskell98から変更されていません。
特に、「表現」のセクションを確認してください。これで、式の解析方法、演算子の優先順位などが説明されます。
これらの関数は型チェックを行わないため、型はありません(ばかげた型クラスの制約が発生します)。(-1)
理由を理解するには、それがタイプを持っていることを知る必要があり、その 前に、親の有無にかかわらずNum n => n
、aがどのように-
解釈されるかを読む必要があります。
次の関数は、関数の「正しい」バージョンです。
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]