私には関数があり、それを呼び出しfct1
ましょう。任意のリストを取得し、リスト内のすべての等しいものと2番目のリスト内の残りすべてを取得し、それらはタプル内にあります。
data sale : ( sale string int)
fct1 [sale,sale..sale]
最初のリストで文字列が同一で、2番目のリストで他のすべての文字列を持つセールのみが返されます)
番号の例(理解しやすい):fct1 [1,2,3,4,6,7,1,3,4]= ([1,1],[2,3,4,6,7,3,4])
そして、2番目の関数があります。それを呼び出しましょうfct2
。
fct2
は常にfst(tuple)に適用され、結果をリストに蓄積する必要があります。そして、リストは戻り値になります
fst(tuple)にaを適用してから、snd(tuple)fct2
に同じものを適用fct1
して、fct1=[]に到達するまで残りのタプルを再作成する必要があります。
私はそれを再帰的に行わなければならないことを知っています、ただどこから始めればよいのかわかりません...fct1
そしてfct2
また。
これが私の擬似コードです...
type Qty = Integer
type Product =string
data Sales = Sales Product Qty`
as is a list
fct1 = (fct1 (\(Sales product qty) -> product == product(head as)) as)
it return a tuple (list1,list2)
fct2:
fct1はsnd(tuple)で実行する必要があるため、snd(tuple)として[]に到達すると同時に、リストを取得して1つの要素に要約するfst(tuple)fct2で実行する必要があります。単一のリストに保持して蓄積する必要があります。
今回はもっと明確にしたいと思います。
ここに解決策が見つかりました:コードは次のとおりです。
fct2 as = accSales [] as
where accSales n as =
if as == []
then sortBy compareSale n
else let x =sumQty(fst(fct1(as)))
xs = snd(fct1(as))
in accSales (x:n) xs`