ここで混乱を招く可能性があるのは、の自由な使用ですlist。タイプにHaskell表記を使用して問題に取り組み始めます。::「タイプあり」を[Foo]意味し、「Fooのリスト」を意味します。
list1 :: [Symbol]
list2 :: [Number]
type Pair = (Symbol, Number)
(combiner list1 list2) :: [Pair]
foldrこれで、オーバーリスト2を使用してこの問題に取り組みたいようです。
foldr :: (a -> b -> b) -> b -> [a] -> b
foldrにはとが必要step :: a -> b -> bですstart :: b。最終結果を、にしたいので[Pair]、それはそれを意味しb = [Pair]ます。startその場合、おそらく空のリストになります。list2が[a]スロットを埋めるので、それはそれを意味しa = Numberます。したがって、私たちの問題については、step :: Number -> [Pair] -> [Pair]
combiner :: [Symbol] -> [Number] -> [Pair]
combiner list1 list2 = foldr step start list2
where step :: Number -> [Pair] -> [Pair]
step a b = undefined
start = []
foldrこれまでのところ、これはあなたが書いたものと同じですが、私はstepまだ定義していません。では、階段関数とは何ですか?Numberタイプから、aとaを取り、[Pair]を生成する必要があることがわかり[Pair]ます。しかし、これらの入力はどういう意味ですか?さて、Number入力はのいくつかの要素になりlist2ます。そして、[Pair]入力は「これまでのフォールドの結果」になります。だから、私たちは私たちを取り、Numberそれのためにsを作成するために何かPairをして、それからこれまでの結果にそれらを叩きつけたいと思うでしょう。これは、私のコードがあなたのコードと異なり始めるポイントです。
step a b = append (doSomething a) b
doSomething :: Number -> [Pair]
doSomething a = undefined
あなたは、Racketを使用して、おそらくdoSomething無名関数として定義するので、それはlist1スコープ内にあることを意味します。(Haskellの関数のwhere句にあるので、スコープ内にあります)。おそらく、そのリストを使用して組み合わせを生成します。
doSomething a = ... a ... list1 ...
実装doSomethingは、Racketに戻すのと同様に、読者の演習として残されています。ここで定義しているHaskell関数の型アノテーションは、combinerに一般化できることに注意してください[a] -> [b] -> [(a,b)]。