概要: これは Miranda 試験の過去の試験問題ですが、構文は Haskell に非常に似ています。
質問: 次の式の型とその機能は何ですか? (関数 length と swap の定義は以下に示します)。
(foldr (+) 0) . (foldr ((:) . length . (swap (:) [] )) [])
length [] = 0
length (x:xs) = 1 + length xs
swap f x y = f y x
ノート:
Haskell 構文でお気軽に返信してください - 星をポリタイプとして使用して申し訳ありませんが、誤って Haskell に変換したくありませんでした。基本的に、1 つの変数の型が * で、もう 1 つの変数の型が * である場合、それらは任意の型にすることができますが、両方とも同じ型でなければならないことを意味します。** がある場合、* と同じ型を持つことができますが、その必要はないことを意味します。Haskellの使い方でa,b,cなどに相当すると思います。
私のこれまでの仕事
長さの定義から、何かのリストの長さを見つけることができるので、これは次のようになります
length :: [*] -> num.
定義から、swap は関数と 2 つのパラメーターを取り、2 つのパラメーターがスワップされた関数を生成すると思います。
swap :: (* -> ** -> ***) -> ** -> [*] -> ***
foldr は二項関数 (plus のような) 開始値とリストを取り、その関数を使用してリストを右から左に折り畳みます。これは与える
foldr :: (* -> ** -> **) -> ** -> [*] -> **)
関数合成では右結合であることを知っています。たとえば、最初のドット (.) の右側にあるものはすべて、最初のフォルダーへの引数として与えられるため、リストを生成する必要があります。
foldr 関数は単一の値 (リストを折りたたんだ結果) を出力するので、戻り値の型はポリタイプのリストではなく、ある種のポリタイプになることがわかります。
私の問題
ここからどこへ行くのか本当にわかりません。swap が別の引数を受け取る必要があることがわかりますが、この部分的な適用は全体が関数であることを意味しますか? 私はかなり混乱しています!