【发布时间】:2020-03-18 01:38:06
【问题描述】:
所以我试图创建这个函数 AgregarMon,它基本上将“Monomio”添加到“Polinomio” Monomio 最终会成为 Polinomio 中的一个元素,它是一个列表。一会儿你就会明白的了
type Monomio = (Int, Int)
type Polinomio = [Monomio]
agregarMon :: Monomio -> Polinomio -> Polinomio
agregarMon = \m p -> case m of{ (0,0) -> p;
x -> case p of{[] -> [x];
y:ys -> case (snd x == snd y) of { true -> case ((fst x + fst y)==0) of { true -> ys;
false -> (fst x + fst y , snd x):ys;}
false -> case snd x < snd y of{true -> y: agregarMon x ys;
false -> x:y:ys;}}}}
我一直在查看我的代码一个小时,但我找不到问题所在。错误说:
Polinomios.hs:45:140: error:
Unexpected case expression in function application:
case ((fst x + fst y) == 0) of
true -> ys
false -> (fst x + fst y, snd x) : ys
You could write it with parentheses
Or perhaps you meant to enable BlockArguments?
|
45 | y:ys -> case (snd x == snd y) of { true -> case ((fst x + fst y)==0) of { true -> ys; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
第 45 行是上面代码的第四行。对不起,如果我缺少信息,请让我现在。 以防万一,有人不知道,fst 和 snd 在 Prelude 上。 fst 从“Monomio”中获取第一个元素,然后获取第二个元素。 fst = (a,b)->a snd (a,b) -> b
【问题讨论】:
-
老实说,基于布局的格式与手动花括号/分号的奇怪组合让我很难说出编译器认为你的代码意味着什么。如果您去掉所有
{};字符并正常布局,会更容易理解。 -
警告:
true不是True,它是一个和其他变量名称一样的变量名,它将匹配任何布尔值,包括False!启用警告以帮助 GHC 发现此类错误。 -
每个人都在抱怨格式,但@chi 注意到了真正的问题
标签: function haskell recursion switch-statement haskell-prelude