1

ねえ、私は金曜日に来る関数型プログラミング試験に向けて改訂していて、講師から与えられた演習に取り組んでいます。私は少し助けが必要なものに出くわしました:

6. a) リストのリスト yss 内のすべてのリストで、指定されたリスト xs を圧縮する関数を作成します。関数を定義する際には、部分適用とラムダ式を可能な限り使用してください。b) 指定されたリスト xs を持つリストのリスト yss 内のすべてのリストを圧縮する関数を作成します。関数を定義する際には、部分適用とラムダ式を可能な限り使用してください。この問題のパート a) とパート b) の解決策の違いは、部分的に適用された関数が正しい順序で引数を取る必要があることを示しています。

(a)について現時点で持っているものは次のとおりです。

zipAll = (\xs (ys:yss) -> [(zip xs ys)] ++ zipAll xs yss)

私が知っているのは限定的ではありませんが、誰かが私にいくつかの指針を与えることができますか?

4

2 に答える 2

1

関数を機能させるには、基本ケースが不足しているようです。基本ケースは

(\xs [ys] -> [(zip xs ys)])

代わりに、パラメーターを方程式の右側に移動する可能性があります。

zipAll xs (ys:yss) = ...

しかし、それはスタイルの問題です。

パート (b) の解決策は同じですが、パラメーターの順序が逆になっている点が異なります。

zipAll (ys:yss) xs = ...
于 2010-01-12T15:47:01.460 に答える
1

結構です、私はそれを解決しました:

zipList :: [a] -> [[b]] -> [[(a,b)]]
zipList = \xs yss -> c xs yss
                        where
                                c xs [] = []
                                c xs (ys:yss) = zip xs ys :zipList xs yss

今これを投稿しなければよかったのに :P

于 2010-01-12T15:47:26.987 に答える