2012-05-06 19 views
3

2つの関数の型を指定する必要があります(コンパイラを使わずに:t)私はちょうど私が正しいステップを作るためにこれらの関数をどのように読み込むのかわかりません。私はそれがこのような質問のためにハスケル型dessignation

+1

'マップ-1 X 'は、(マップ)'として解析されます - (1×) '。しかし、そのタイプは本当にいいです。 – Vitus

+0

それは地図から何かをマイナスしたいのですか? – whd

+0

基本的に。これは、関数型( 'Num(t - >(a - > b) - > [a] - > [b])'にいくつか狂ったconstraitを入れようとしています。 – Vitus

答えて

4

機能アプリケーション、または "空の空白演算子"は、任意の演算子シンボルよりも優先順位が高いため、最初の行はf x = map - (1 x)と解釈されます。は型エラーです。

もう1つの例は見た目のかっこで示してありますが、(-1)デュガールはnegate 1です。これは、通常のルールからの例外です。(+1)のような演算子セクションは(\x -> x + 1)とdesugarなので、はタイプエラーになります。mapは、最初の引数として数字ではなく、関数を期待しているためです。

このチェックを入力することを可能にする機能のためのNumインスタンスを提供することは技術的には可能であるので、私はそう言います。

+0

それは私のためのタイプのチェックですが、結果は醜いです。 –

3

に解析する方法を少し混乱してい

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

まあ、決定的な答えはHaskell Reportをチェックすることです。関連する構文はHaskell 98から変更されていません。

特に、「式」のセクションを確認してください。これは、式がどのように解析されるか、演算子の優先順位などについて説明する必要があります。

2

これらの関数は型を持たないため、型チェックはしません(あなたは型の厳密なクラス制約を取得します)。理由を理解するには、のタイプがNum n => nであることを知っていなければなりません。また、-の前に括弧を入れているかどうかを調べる必要があります。

次の関数は、あなたの関数の「正しい」バージョンです:

f x = map (subtract 1) x 

私はと言う場合は、この機能の種類を把握することができるはずです。

subtract 1 :: Num n => n -> n 
map :: (a -> b) -> [a] -> [b] 
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]