我有以下问题:给定最大(最大)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上。
有人可以帮助我吗?
谢谢你,抱歉我的英语不好。
答案 0 :(得分:3)
如果我可以从一些旁注开始,你的一些函数已经存在于Haskell中(现在我开始想到它你可能已经写过它们用于练习,但以防万一它不会在这种情况下,让我们讨论一下):你的higher
是maximum
,smaller
是minimum
而你的插页只是(:)
,因为你自己写的是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非常擅长推断类型,但总是添加 在代码中键入签名是捕获这些类型的好方法 早期的错误。