2016-08-28 16 views
-2

"haskells dot"という質問は、stackoverflowの前に数回答えられましたが、まだ完全には得られていないことを示す例があります。 >f (g x) = (f . g) x - さんは、私は私の知る限り、関数合成のようなドット作品を知っているように、機能今haskellのドット、トリッキーな例

f :: Integer -> Integer 
f x = x 
g x = \y -> y 

を持っているとしましょう。 g 2つの引数を取り、第二1を返し、fは単にアイデンティティであるのでそう

(f . g) 4 5

shuldは5を返します。しかし、それはCouldn't match typeエラーを取得していません。私はhaskellがこのエクスプレッションを((f . g) 4) 5のようなものに構文解析すると感じています。しかし、私はもっと深い説明が必要です

+0

それは5.たぶん、あなたは別の何かで入力を返すのですか? –

答えて

2

、我々は持っている:

(f . g) x = f (g x) 

をしたがって、特に

(f . g) 4 = f (g 4)    (*) 

そこから我々は

(f . g) 4 5 
= -- application associates to the left 
((f . g) 4) 5 
= -- equation (*) above 
(f (g 4)) 5 = 
= -- application associates to the left 
f (g 4) 5 

を持っている私たちは今、見ることができる最後の引数は、 5fの第2引数として残り、ではなくgに渡されます。

ハスケル関数がカレー化されていることを覚えておくと便利です。技術的には、2つの引数をとる関数のようなものはありません。型がa -> b -> cの関数は実際には単項関数を返す単項関数です。たとえそれを二項関数と考えることができたとしてもです。

構成演算子は単項関数でも動作します。f . gは単項関数fgを構成します。 fが "binary"の場合、関数を返す単項関数として扱われます。上記のように、これは追加の引数を取る。 gが「バイナリ」の場合、返される関数はfに渡されます。

ので、上記の定義使用:

f x = x 
g x = \y -> y 

を我々が得る:

(f . g) 4 5 
= -- done above 
f (g 4) 5 
= -- associativity 
(f (g 4)) 5 
= -- definition of f 
(g 4) 5 
= -- definition of g 
(\y -> y) 5 
= -- beta reduction 
5 
+0

私の質問にfのタイプについて言及するのを忘れました。それはInteger - > Integerでした。これが私がエラーになった理由です – user3713267

0
main = print $(f . g) 4 5 

f x = x 
g x = \y -> y 

プリントがうまくコンパイルされます。5.私はGHC 8.0.1を使用しています。 完全な最小限の例を提供したいと思いますか?質問で述べたように

関連する問題