尝试在Haskell中“打印”列表时出错

时间:2016-08-05 02:08:30

标签: list haskell

我有以下问题:给定最大(最大)apacity,并给出一个值列表(listOfValues),我需要返回一个包含listOfValues值的列表。元素的总和必须是< = max,我需要优先考虑更高的值。

示例:输入solveProblem 103 [15,20,5,45,34]我必须得到:[45,45,5,5]

要解决此问题,请创建以下代码:

solvingProblem max [] = 0
solvingProblem max listOfValues | max == 0 = 0
                                | otherwise = createList max listOfValues []


createList max [] result = -1
createList max listOfValues result | smaller listOfValues > max = -1
                               | higher listOfValues > max = createList max (remove (higher listOfValues) listOfValues) result
                               | otherwise = createList (max - higher listOfValues) listOfValues (insert (higher listOfValues) result)

higher [a] = a
higher (a:b:x) | a > b = higher (a:x)
              | otherwise = higher (b:x)

smaller [a] = a
smaller (a:b:x) | a < b = smaller (a:x)
              | otherwise = smaller (b:x)

remove x [] = []
remove x (h:t) | x == h = remove x t
                | otherwise = h : remove x t

insert x (h:t) = x : h : t

在我将返回“-1”的两行中应该是参数“result”,但如果我将“-1”更改为“result”,则代码不会加载到ghci上。

有人可以帮助我吗?

谢谢你,抱歉我的英语不好。

2 个答案:

答案 0 :(得分:3)

如果我可以从一些旁注开始,你的一些函数已经存在于Haskell中(现在我开始想到它你可能已经写过它们用于练习,但以防万一它不会在这种情况下,让我们讨论一下):你的highermaximumsmallerminimum而你的插页只是(:),因为你自己写的是insert x list = x:list remove。请注意,如果您将其列为空列表,则您的版本将失败,因为模式匹配并非详尽无遗。您也可以根据过滤器remove x list = filter (== x) list编写ghci

现在为什么你的代码没有正确加载? • Non type-variable argument in the constraint: Num [a] (Use FlexibleContexts to permit this) • When checking the inferred type solvingProblem :: forall a. (Ord a, Num [a], Num a) => a -> [a] -> [a] 告诉你:

solvingProblem

我同意这一点非常神秘,但它所说的是a的返回类型是Num的列表,并且由于某种原因它也是Num的一个实例类型类。它说它是solvingProblem的实例的原因是因为0的返回值之一是[]这是一个数字,这有点奇怪,因为它也是一个列表。使用insert更改0会使代码编译并运行(如果使用(:)更改λ> solvingProblem 103 [15,20, 5, 45, 34] [5,5,45,45] it :: (Ord t, Num t) => [t] ,否则您将获得我之前讨论的非详尽模式匹配。

var storeDuplicates = {}; // object to act as a hash

答案 1 :(得分:1)

问题在于createList中的最后一个保护条款。

您打算createList的类型似乎是:

createList :: Int -> [Int] -> Int -> Int

但如果你看一下最后一个保护条款:

| otherwise = createList (max - ...) listOfValues (insert ...)
                         ^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^
                          Int        [Int]        [Int]

尽管GHC非常擅长推断类型,但总是添加 在代码中键入签名是捕获这些类型的好方法 早期的错误。