【发布时间】:2019-02-09 17:03:38
【问题描述】:
所以我刚刚掌握了 Haskell 的窍门,并陷入了使用 Do 创建嵌套 if-else 语句的语法上。 我不确定,如果我应该使用多个 Do,或者我是否可以只用一个来完成这一切。 我也不确定是否应该使用 return 语句以及是否需要所有分号。
我尝试添加和删除大括号、return 语句、分号、不同的缩进,但不知道还能尝试什么。
我收到类似“ • 无法将预期类型‘m0 (m0 b0)’与实际类型‘Int’匹配”之类的错误 • 在“do”块的语句中:a
-
这是我正在尝试构建的那种结构,但它给了我错误。您可以将 getVal 函数想象为返回整数的任意函数:
func :: Int -> Int func val = do { if val < 10 then do { a <- getVal0; b <- getVal1; if (val+a+b) < 0 then return 1 else return 2} else if val > 10 then do { a <- getVal2; b <- getVal3; if (val + a +b) < 0 then return 0 else return 1} else return 99; }
get val 的一个例子是:
getVal :: Int
getVal = 5
所以这就是我想要发生的事情:
如果 val
如果 val > 10,则从 getVal2 获取 a,从 getVal3 获取 b。如果 val+a+b
如果 val 既不是 10 (val = 10) 则返回 99
感谢您的反馈和帮助!
【问题讨论】:
-
getVal0和getVal1是什么?但看起来您正在尝试使用do块,它既不必要又无效。do块仅用于单子内的计算 -Int不是单子值,因此您不能使用do块来计算这样的值。 -
do不会像您认为的那样做。return和<-同上。这个函数不需要这些。 -
也许你想在这里使用
let ... in ...语法。 -
我试着写一个答案,但这太宽泛了;需要解释 haskell 语法、纯度、
do表示法等。即使尝试修复此代码块也很大程度上取决于构成的getVal1的类型。如果您仍然卡住,您可以尝试只问一个问题,使用 MCVE 吗? -
@jberryman 我认为一个简单地显示使用
let的正确方法的答案,而不涉及为什么do不合适,就足够了。 OP 评论说getVal0和getVal1是函数,所以我们可以假设像let a = getVal0 parm1 parm2 in ...这样的东西是意图。
标签: haskell