看來,這裏可能會增加混淆的一點是自由使用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 = []
到目前爲止,這是一樣的,你寫的,但我還沒有定義step
尚foldr
。那麼step功能是什麼?從該類型中,我們知道它必須採用Number
和[Pair]
並生成[Pair]
。但是這些輸入是什麼意思?那麼Number
輸入將是list2
的一些元素。 [Pair]
輸入將是「到目前爲止的結果」。 所以我們想要拿我們的Number
,做爲它創建Pair
s,然後將它們拍到目前爲止的結果。這是我的代碼開始與你不同的地方。
step a b = append (doSomething a) b
doSomething :: Number -> [Pair]
doSomething a = undefined
既然你,用球拍,可能會定義doSomething
作爲一個匿名函數,這意味着list1
是在範圍內。 (因爲它位於Haskell函數的where子句中,所以它在範圍內)。您可能會使用該列表來生成組合。
doSomething a = ... a ... list1 ...
實施doSomething
就留給讀者做練習,如翻譯回球拍。請注意,我在此定義的Haskell函數的類型簽名combiner
可以推廣到[a] -> [b] -> [(a,b)]
。
感謝所有提交幫助的人!奧斯卡,我同意這是一個很好的解決方案,但我需要找到一個使用lambda和foldr的解決方案。幸運的是,我設法解決了這個問題......保留一個在另一個之內!非常感謝! – David