質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Q&A

解決済

1回答

989閲覧

haskellのラムダ関数の仕組みについて

takuyaKK

総合スコア37

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

0グッド

0クリップ

投稿2021/08/09 12:54

haskellのラムダ関数の挙動についての質問です。

haskell

1cup f10z = \_ -> f10z 2coffee = cup 7 3get0z aCup = aCup (\f10z -> f10z)

上のようなコードを書いてから実行すると

haskell

1*Main> get0z coffee 27

このように値が返ってくるのですが、なぜこのコードが動くのかが分かりません。

get0z という関数は右辺にラムダ関数があるので、この関数を実行するには引数1つに加えてもう一つラムダ関数に渡す用の引数が必要になる気がするのですが、なぜ今回は引数を1つしか渡していないのに動くのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/08/09 19:11

cup 7 は \_ -> 7 であり、引数を使ってないので、get0z の右辺にあるラムダ関数 (\f10z -> f10z) は実行されません。
guest

回答1

0

ベストアンサー

ひとつずつ簡約していきましょう。

haskell

1get0z coffee 2 ≡〈get0z の定義(ただし aCup = coffee)〉 3 coffee (\f10z -> f10z) 4 ≡〈coffee の定義〉 5 cup 7 (\f10z -> f10z) 6 ≡〈cup の定義(ただし f10z = 7)〉 7 (\_ -> 7) (\f10z -> f10z) 8 ≡〈関数適用〉 9 7

分からない点としましては、最後の

haskell

1(\_ -> 7) (\f10z -> f10z)

という式の部分で、これは (\x -> 7) (\f10z -> f10z) と書いても正しく実行されるんですが、この場合左のラムダ関数の x という引数に入るのが、右側のラムダ関数 (\f10z -> f10z) を実行した結果ですよね?じゃ右側のラムダ関数 (\f10z -> f10z)f10z という引数には何が渡されるのかというと何も渡されていないので混乱してしまっております。。。

x\f10z -> f10z という関数そのものになります。x が関数であることを確かめるために次のようなコードを考えてみましょう。

haskell

1(\x -> x 7) (\y -> y + 1)

どうでしょうか?これも簡約していくと次のようになります。

haskell

1(\x -> x 7) (\y -> y + 1) 2 ≡〈関数適用(ただし x = \y -> y + 1)〉 3 (\y -> y + 1) 7 4 ≡〈関数適用(ただし y = 7)〉 5 7 + 1 68

投稿2021/08/10 00:20

編集2021/08/10 03:03
kakkun61

総合スコア285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuyaKK

2021/08/10 00:57

ありがとうございます!あと少しで分かりそうです! 分からない点としましては、最後の (\_ -> 7) (\f10z -> f10z)  という式の部分で、これは(\x -> 7) (\f10z -> f10z)と書いても正しく実行されるんですが、この場合左のラムダ関数の「x」という引数に入るのが、右側のラムダ関数 (\f10z -> f10z)を実行した結果ですよね?じゃ右側のラムダ関数 (\f10z -> f10z)の「f10z」という引数には何が渡されるのかというと何も渡されていないので混乱してしまっております。。。
takuyaKK

2021/08/10 03:38

うわー、こういう挙動だったんですね。haskell難しい、、、 お陰様で理解できました!ありがとうございます!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問