我试图在列表中获得具有最大总和的列表,然后返回该列表.但是当我用这个函数调用时
max_list [[1,2],[3,6],[10,34,5]]
Run Code Online (Sandbox Code Playgroud)
它给了我错误:
Exception: a4.hs:65:1-64: Non-exhaustive patterns in function max_list
Run Code Online (Sandbox Code Playgroud)
这是代码:
max_num :: [Int] -> Int
max_num [x] = x
max_num (x:xs) | (max_num xs) > x = maxVal xs
| otherwise = x
max_list :: [[Int]] -> [Int]
max_list [[a]] = head(filter (\x -> (sum_int x) == (max_num [[a]]) [[a]])
Run Code Online (Sandbox Code Playgroud)
我的逻辑如下:我愿意
示例电话:
head (filter (\x -> (sum x) == 11) [[1,3],[4,7],[2,5]])
> [4,7]
Run Code Online (Sandbox Code Playgroud)
所以在那种情况下,我计算了手中的值11,并且每个元素的总和是[4,11,7],它将给出其总和等于最大值的值
我正在尝试在 Haskell 中编写一个函数,该函数将采用整数列表,例如 [1,2,3,4,5] 并使用递归将它们转换为数字,例如 12345。我正在使用 Haskell 标准库中的长度函数来计算数字的位置,以便将它们加在一起(10000+2000+300+40+5)。但是,当我使用 length 来计算列表的长度时,无论如何它总是 1,我不知道为什么。这是我的代码:
dig :: [Integer] -> Integer
dig [] = 0
dig (x:xs) = x * (10^(fromIntegral(length[xs]))) + fromDigits(xs)
Run Code Online (Sandbox Code Playgroud)
运行此代码将始终只是将数字乘以 10 并且长度始终为 1,因此 dig [1,2,3,4] 给出 100 而不是 1234。
我正在尝试实现该功能tails.这是我的尝试:
tails' :: [a] -> [[a]]
tails' [] = []
tails' (x:xs) = xs:[[tails' xs]]
Run Code Online (Sandbox Code Playgroud)
我一直遇到编译错误:
Couldn't match expected type ‘a’ with actual type ‘[[a]]’
‘a’ is a rigid type variable bound by
the type signature for tails' :: [a] -> [[a]] at..
Run Code Online (Sandbox Code Playgroud)
我的实施有什么问题?
在Haskell中,为什么模式匹配期望列表具有圆括号,但是当它不为空时不支持方括号?当它尝试使用空列表[](方括号)进行模式匹配时,为什么它不遵循相同的约定.不应该专门为元组保留圆形括号吗?
例如 - 下面不起作用
third :: Integral a => [a] -> a
third xs = case xs of
[] -> 0
[_:_:x:_] -> x
otherwise -> 0
Run Code Online (Sandbox Code Playgroud)
但这很有效
third :: Integral a => [a] -> a
third xs = case xs of
[] -> 0
(_:_:x:_) -> x
otherwise -> 0
Run Code Online (Sandbox Code Playgroud) 我偶然发现了一个令我非常困惑的错误。我有一个带有模式匹配的递归函数,["",_] = []但它根本不起作用。经过多次尝试找出我的错误后,我尝试将其与("":_) = []. 它成功了!我只是想知道为什么第一个术语不起作用但第二个术语起作用。该函数起作用并调用模式匹配:
takeAllElem :: [String] -> [String]
takeAllElem ("":_) = []
takeAllElem (xs) = map takeFirstElem (xs) : (takeAllElem (removeFirstElem (xs)))
Run Code Online (Sandbox Code Playgroud)
这个函数也可以工作,但是模式匹配永远不会被调用:
takeAllElem :: [String] -> [String]
takeAllElem ["",_] = []
takeAllElem (xs) = map takeFirstElem (xs) : (takeAllElem (removeFirstElem (xs)))
Run Code Online (Sandbox Code Playgroud)
这只是一个语法错误还是编译器的解释["",_]与("":_).