

例えば、filterの定義として、
filter :: (a -> Bool) -> [a] -> [a]
filter p xs = [x | x <- xs, p x]
というのがありますが、foldrを使用すると、
filter :: (a -> Bool) -> [a] -> [a]
filter p = foldr (\x xs -> if p x then x : xs else xs) []
として、引数を一個減らして書いた定義ではありますが、
2つとも同じ意味です。
ここで、ふと思ったのですが、ふたつめのfoldrを使用した場合での定義
として、xsとxはどこで、「xsとxはこの部分である」と指定されているでしょうか。例えば、
filter (+) [1,2,3]
とすれば、xは1で、xsは[2,3]というのは人間から見てわかりますが、
コンピュータとしてはどう理解しているのでしょうか。
説明がわかりにくいかもしれませんが、
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
No1の続きです。
何が問題で何を勘違いしているのかの方向性が分ったのできちんと回答します。
まず前提として
一番目に
質問のxとxsの間には":"が付いていないので、
xがリストの先頭要素xsが先頭要素を取り除いたリストではありません。
今回は、無名関数の第一引数と第二引数の意味しかありません。
ただし、型推論で推論された型を考えるとxsはリストでxはリストの要素という型になります。
二番目に
foldr関数について自分で使えるぐらい十分に知っておいてください。
filter (>2) [1,2,3]
を例にすると
filter (>2) [1,2,3]
⇒foldr (\x xs -> if (>2) x then x : xs else xs) [] [1,2,3]
無名関数(\x xs -> if (>2) x then x : xs else xs)は長いのでとりあえずfとします。
f :: a -> [a] -> [a]
なので
fは二つ引数を持ち、一番目が任意の型で二番目が一番目の型のリスト
fの戻り値の型は二番目の型と同じということが分ります。
ここ重要です。
fの一番目の引数が質問のxで二番目の引数がxsです。
No1にもあげたとおりこれが質問の回答です。
それ以上でもそれ以下でもないんですがさらに具体的にしないと分からないと思うので、
さらに計算を続けて、
foldr (\x xs -> if (>2) x then x : xs else xs) [] [1,2,3]
⇒foldr f [] [1,2,3]
foldrの定義にしてがって
⇒1 `f` (2 `f` (3 `f` []))
`f`の意味を知らないかもしれないので、`を使わない形に変換する
⇒f 1 (f 2 (f 3 []))
便宜上外側のfからf1 f2 f3する。
質問のx とxsに当てはめると
f1の場合
x は1
xs は(f 2 (f 3 []))
f2の場合
x は2
xs は(f 3 [])
f3の場合
x は3
xs は[]
となります。
foldrの定義自体は知っていました。ただ、xが値、xsをリストであることを
どうやってコンピュータは理解していたのであろうと考えていました。
型推論なんですね。
無名関数の、
if (>2) x then x : xs else xs
によって、推論されていたということだとわかりました。
ありがとうございました。
No.1
- 回答日時:
例に挙げていたこれ
>filter (+) [1,2,3]
はコンパイルが通らないのでなんかのミスと思います。
filter (>2) [1,2,3]
とかの間違いかな。
また、コンピュータの理解の意味が分らないので勝手に質問を解釈すると
質問の意図は
>filter p = foldr (\x xs -> if p x then x : xs else xs) []
の
x とxs って何のことか教えてくださいということでいいでしょうか?
結論だけ答えると、
foldr の第一引数の一番目の引数と2番目の引数を示しています。
これ以上書くと質問の意図とずれた時が無駄なので、今回はここでやめておきます。
この回答への補足
>filter (>2) [1,2,3]
すみません、関数の勘違いで、上記の場合と考えていただけたら良いです。
x,xsはそれぞれリストの先頭要素、xsは先頭要素を取り除いたリストであること
は理解しています。
ただ、xやxsはコンピュータ的に見ると、適当に名前をつけた仮のものですよね。
xはリストでなくひとつの数でないといけないことや
xsは数でなくリストでないといけないことはどうしてわかるのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba 正規表現について教えてく...
-
pythonでのローカルファイルか...
-
画像生成AIのプロンプトの作り...
-
CSVファイルの複数行削除
-
vba クリップボードクリアにつ...
-
if関数とは?
-
COPYコマンドで、最後に1文字...
-
uwscでPauseキーが押されたら、...
-
自作scratch アニメの商用利用
-
プログラム言語
-
Geminiフォーム 画像生成で 人...
-
pip --versionがエラーになる
-
プログラミングに興味があるの...
-
IT業で開発をされてる方々に質...
-
Pythonのエラーメッセージをコ...
-
Python... 環境設定 初心者です...
-
著作権法について
-
今のプログラミング言語
-
プログラミングについて
-
数学、プログラミング、物理、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Eclipse でBASIC認証するには
-
計算問題が分かりません… どな...
-
PerlによるXMLからCSVへの変換...
-
XMLスキーマのrefの使い方
-
順不同・任意のタグ
-
PHPでXMLデータ生成、スキーマ...
-
Haskell: foldrの使用について
-
XML の属性部分を JavaScript ...
-
内容にテキストを持つタグの属...
-
XMLで主キーを自動的に入力する...
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
東芝のDynabookなのですがアン...
-
XMLで要素が記述された順番に意...
-
XML、XSLTの適応エラー(IEから...
-
C#でTreeViewのCheckBoxのサイ...
-
xmlファイルが上手にHTMLに変換...
-
昔Winnyってありましたけど、あ...
-
バッチファイルでテキストファ...
おすすめ情報