“在Project Euler练习中,无法将预期类型`Int'与实际类型`[Int]”匹配

时间:2012-07-15 20:53:32

标签: haskell

我想帮助“我的方式”这样做,因为如果我想知道更好/更多Haskellic方法,我可以google其他解决方案

现在我明白了:

Couldn't match expected type `Int' with actual type `[Int]

这是我的想法,但在某个地方它是错误的。在发送累加器时如何进行(我在“基本情况”中反复思考过)

我的想法是我选择其中一个硬币,然后将所有其他硬币添加到单独的递归中并查看它是否等于200,如果是,那么这就是我想要添加到我的结果中,如果更低,添加硬币到列表,例如[100,50],然后以相同的方式递归。如果高于200,则返回null / empty或其他。到目前为止,我称之为添加的硬币是Hand

module Main where

coins = [100,50,20,10,5,2,1]

euler31 :: Int
euler31 = 1 + length (twoPoundCombinations)

twoPoundCombinations = recursion [] [[]]

recursion :: [Int] -> [[Int]] -> [[Int]],
recursion hand result
    | sum hand == 200 = [hand]
    | sum hand  > 200 = [[]]
    | sum hand  < 200 = result ++ map (\x -> recursion (x:hand) [[]]) coins

1 个答案:

答案 0 :(得分:2)

map (\x -> recursion (x:hand) [[]]) coins

会有[[[Int]]]类型。那是[]过多的一层。

result ++ concat (map (\x -> recursion (x:hand) [[]]) coins)

会有正确的类型。

(但你的方法需要很长时间才能得到正确的结果。)