アプリ版:「スタンプのみでお礼する」機能のリリースについて

haskell初心者です。
合成関数(.)について質問があります。

(.)関数の引数はghciの:tで調べると
(.) :: (b -> c) -> (a -> b) -> a -> c
と出てきます。
これは、第一引数に一引数関数、第二引数に一引数関数、第三引数に定数関数を取る、という解釈で合っていると思います。
また、ghciで次の式
((+) . (+3)) 5 500
を評価しすると
508が出力されます、エラーはありません。

なぜ二引数関数の(+)を(.)の第一引数に入れてもエラーがでないのでしょうか。
おそらく僕のカリー化や合成関数に関する基礎知識が浅いためこのような疑問が生まれたのだと思います。できればこれらの知識を絡めた回答を希望しますが、わがままは言えません。

よろしくお願いします。

A 回答 (4件)

(+) を「二引数関数」と思っちゃうからいかんのよ.



「数値を引数にして『数値を引数にして数値を返す関数』を返す」なので, 引数は 1個.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ということは(.)関数の(b -> c) のcは関数になるわけでしょうか?

お礼日時:2013/01/05 20:43

この場合は関数 (というよりは型だから「関数型」というべきか?) になります.



ああ, 考えてみたら「第一引数に一引数関数、第二引数に一引数関数、第三引数に定数関数を取る、という解釈」がおかしいんだ. 合成した結果は関数なんだから, 本当は
(b -> c) -> (a -> b) -> (a -> c)
と読まなきゃならない.
    • good
    • 0

補足です.



c のみならず, a や b も関数型となることはあり得ます. 意味があるかどうかはさておき, 2つの引数に共通する型変数 b を同じものにできるなら「型付け」における問題は発生しません.

例えば
foo :: Int -> Int -> Int
bar :: (Int -> Int) -> Int -> Int
のとき (bar . foo) という合成が可能で, その型は
(bar . foo) :: Int -> Int -> Int
となります.

ちょ~ニッチな世界だけど, 組み合わせ論理を知っていると幸せになれる... かなぁ?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
もう一度一つ目の回答を考えるとなんとなくわかりました。
それと回答に挙がっている「組み合わせ理論」というのは数学における「組み合わせ理論」でしょうか。

お礼日時:2013/01/15 00:24

えぇと, 「組み合わせ理論」じゃなくって「組み合わせ論理」ね. 英語だと Combinatory Logic.



参考URL:http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3% …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!