概要:これは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のに間違ってそれを翻訳したくありませんでした。基本的に、一方の変数に*型があり、他方の型に*がある場合は、どちらの型でも構いませんが、どちらも同じ型でなければなりません。 **を持っている場合は、*と同じ型を持つ必要はありません。私はそれがiskell usuageのa、b、cなどに相当すると思います。あなたは、この定義から
length :: [*] -> num.
を与えるので、それは私がスワップにかかると思うもののリストの長さを見つけることが確認でき、これまで
長の定義から作業
マイ関数と2つのパラメータを入れ替え、2つのパラメータを入れ替えた関数を作ります。これにより、
swap :: (* -> ** -> ***) -> ** -> [*] -> ***
foldrは、バイナリ関数(プラスのような)で開始値とリストを取り、その関数を使用してリストを右から左へフォールドします。これは
foldr :: (* -> ** -> **) -> ** -> [*] -> **)
私は関数合成で、最初のドット(。)の右側にある例のすべてのためにそれが最初foldrの引数として与えられますので、リストを生成する必要があるので、右結合である知っています。
foldr関数は単一の値(リストを折りたたんだ結果)を出力するので、戻り値の型はある種のpolytypeになり、polytypeのリストにはなりません。
私の問題
私は本当にここから行くためにどこか不明です。私は、スワップが別の議論をとる必要があることを見ることができます。この部分的な適用は、すべてが機能であることを暗示しますか?私はかなり混乱しています!
あり、どうしたの? 'Prelude>はswap = flip'' Prelude>:t(foldr(+)0)としましょう。 (foldr((:) swap(:) [])[]) ' '(foldr(+)0)。 (foldr((:) swap(:) [])[]) :: [a] - > Int'。 – leftaroundabout
答えに感謝しますが、私はそこにもどる方法を理解する助けを得ることを望んでいました!答えを知っていることは間違いなくそこに経路を見つけようとするのには間違いありません。 – user1058210
GHCiの完全な部分式をテストすることができます。 – leftaroundabout