2017-04-07 9 views
2

私はハスケルを初めて使いました。私は言語の概念のいくつかを理解するのに少し苦労しています。haskellでの式のタイプ

私は、次の式があります。

\f x → (f x,f 1)

そして、私の理解から、私はそれを言うことができます。

  • 最初に、私は本当に理由は私が何であるかをFと言うことはできません情報がない、 なので、私は何でもできると言う。次に、(FX)のアプリケーションから判断

    それはタイプA-の 機能だと言うことができ> X ::そして(1 F)のアプリケーションから判断

    私はそれを言うことができるここで、B Integer型のものであり、したがって、xは同じ型である

式全体が型であるなぜ、私は本当に理解していない:

(Integer → b) → Integer → (b, b)

私は少し推測を持っていると私はそれを言うつもりです:

(Integer → b)は、関数fのタイプなので、それはb型

Integerを受け取り、整数と返すには、xの型であります

(b b)は、2つの関数の型ですか?

誰かが正しい方向に私を向けることができますか?ありがとうございます

+0

です。 '\ f x - >(f x、f 1)'はGHCiでは文字定数 '' 1''が '' Integer''にデフォルト設定されているので '(Integer-> b) - > Integer->(b、b)'に制約されます。したがって、関数であると推定される 'f'は' Integer'をとります。 tuple要素の1つで 'x'が' f'に渡されるので 'x'は' Integer'でなければなりません。 '(b、b)'はちょうどタプルで、 'b'は' f'の戻り値の型です。 – bheklilr

+0

ありがとうございました!それは素晴らしい説明です!感謝します。 –

+0

この 'c b a = a b 'が' c :: t1 - >(t1 - > t) - > t'型である理由を教えてください。 @bheklilr –

答えて

2

あなたは正しいです。

1 :: Integerfが適用されているので、f :: Integer -> bに適用されます。

fxにも適用されているので、x :: Integerです。

ラムダの結果はfというアプリケーションのタプルなので、結果の型は(b, b)です。

ラムダの型はのタプルにIntegerをとる関数にfの型を取る関数です。

編集

c b a = a b 

b :: t1を想定します。

bに適用されているので、a :: t1 -> tと言うことができます。

cbaを適用した結果に(tを)at1 -> t)のタイプのものにbt1)のタイプのものを取るので、我々はc :: t1 -> (t1 -> t) -> tことを言うことができます。

+0

あなたの答えをありがとう!それは有り難いです。 @pat。あなたは親切で、なぜこの 'c :: t1 - >(t1 - > t) - > t 'が' c b a = a b'の型であるのか教えてください。それは今私が本当に理解していない唯一のものです。 –

+0

必要はありません、私はすでに自分でそれを理解して、ごめんなさい。 –

4

ラムダ全体が関数fxを入力として受け取ります。それは のペアを生成します。ペアの最初の要素はfをxに適用した結果、2番目の要素はfを1に適用した結果です。f 1から、fへの入力はNumタイプクラスに制限する必要があります。

getPair :: Num a => (a -> b) -> a -> (b, b) 
getPair =   \f   x -> (f x, f 1) 

唯一の制約は、あなたがそれはかなり正しいんだNum a =>

getPair id 8.9 => (8.9, 1.0) 
getPair (\x -> x > 0) (-9.8) => (False, True)