Haskellはケース1で2つの関数呼び出しを順番に実行できますが、以下のケース2で混乱します。なぜですか?Haskellで実行シーケンスを調べる方法は?
ghci> id id 1 -- case 1
ghci> (+1) id 1 -- case 2
Haskellはケース1で2つの関数呼び出しを順番に実行できますが、以下のケース2で混乱します。なぜですか?Haskellで実行シーケンスを調べる方法は?
ghci> id id 1 -- case 1
ghci> (+1) id 1 -- case 2
機能アプリケーションは、左結合され、あなたの例のように解析されることを意味する:
(id id) 1
((+1) id) 1
前者は従って減少:
(id id) 1
id 1
1
後者はです。TypeCheckありません。 (+1)
のタイプはNum n => n -> n
ですが、id
のタイプはa -> a
で、数値ではありません。
(+1) (id 1)
を意味する場合は、括弧で括らなければなりません。
'(id + 1)1'と書くと、2番目の式がなぜ機能しないのかは、はっきりしているでしょう。 – leftaroundabout
ありがとうございます。ポイントは、 '(id id)'がタイプチェックであるということです。ハスケルに存在する他のタイプレス関数はありますか? – sof
@ idの中にはタイプがありません。すべてがタイプを持っています。 'id'の型は' a - > a'です。式 'id id'では'(a - > a) - >(a - > a) 'の最初の' id'が使用されています ' –
2番目のケースで出力がどのようになると思いますか? – gigabytes