【发布时间】:2012-02-13 22:53:05
【问题描述】:
我尝试过多种方式:if-then-else、守卫、case 语句,但我从未设法编译它。我认为从代码中很清楚我想要做什么。为什么这是不可能的,我必须做些什么才能弄清楚?
appendMsg :: String -> (String, Integer) -> Map.Map (String, Integer) [String] -> Map.Map (String, Integer) [String]
appendMsg a (b,c) m = do
let Just le1 = length . concat <$> Map.lookup (b,c) m
le2 = le1 + length a
if le2 < 1400 then (let m2 = Map.adjust (x ++ [a]) (b, c) m) else (print (le1, le2))
return (m2)
我在这里收到的错误消息是parse error on input `)'。如果我更改括号,我会得到parse error on input `else'。如果我在 else 路径中说 (let m2 = m),那么我会再次遇到括号错误。
我试图实现的是,如果 le2 创建
f x = x ++ [a]
m2 = Map.adjust f (b, c) m
如果 le2 > 1400 则应调用另一个函数,该函数采用与 appendMsg 相同的参数,并且 appendMsg 应该不返回任何内容。
另一个问题是,一旦根据以下所有建议正确设置:
if le2 < 1400 then let m2 = Map.adjust (++ [a]) (b, c) m in return (m2) else return ()
我收到一个错误提示
No instance for (Monad (Map.Map (String, Integer)))
arising from a use of `return'
顺便说一下,当我使用警卫时,我最终遇到了同样的错误。问题是我在剩下的代码中对这种奇怪的类型几乎无能为力。我可以以任何方式将此类型转换回 (Map.Map (String, Integer) [String]) 或完全避免它吗?
【问题讨论】:
-
一般来说,包含您收到的错误消息是个好主意。
-
如果
le2 >= 1400等于m2? -
如果遵循
else路径会返回什么? -
if-then-else语句的两个分支必须具有相同的类型。您的语句的then分支实际上根本没有类型,因为您有一个没有任何后续语句的 let-binding,而else分支实际上是IO ()类型,它在你的功能。 -
如果 Haskell 报告“严重错误”,我会说这是厚脸皮(抱歉,英国笑话)。
标签: haskell