所以我只是抓住了Haskell,并坚持使用Do创建嵌套if-else语句的语法.我不确定,如果我应该使用多个Do或者如果我只用一个就可以完成所有操作.我也不确定是否应该使用return语句,如果所有分号都是必需的.
我尝试添加和删除大括号,返回语句,分号,不同的缩进,不知道还有什么要尝试.
我得到的错误如"•无法匹配预期类型'm0(m0 b0)'与实际类型'Int'•在'do'块的stmt中:a < - getVal"
这是我想要构建的那种结构,但它给了我错误.您可以将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; }
Run Code Online (Sandbox Code Playgroud)get val的一个例子是:
getVal :: Int
getVal = 5
Run Code Online (Sandbox Code Playgroud)
所以这就是我想要发生的事情:
如果val <10,则从getVal0获取带有2个参数的值a,并从getVal1获取b.然后添加val + a + b,如果小于0,则返回1,否则返回2
如果val> 10,则从getVal2获取a并从getVal3获取b.如果val + a + b <0则返回0,否则返回1.
如果val既不<10或> 10(val = 10)则返回99
感谢您的反馈和帮助!
正如在评论中已经提到的,你并不需要do,<-或者return在这里.这些是monadic代码,但在这里你定义了一个常规函数 - 周围没有monad.
所以,我们可以改用let .. in ...这是一种可能的方法,对原始代码进行微小的更改.
func :: Int -> Int
func val =
if val < 10 then let
a = getVal0
b = getVal1
in if val + a + b < 0
then 1
else 2
else if val > 10 then let
a = getVal2
b = getVal3
in if val + a + b < 0
then 0
else 1
else 99
Run Code Online (Sandbox Code Playgroud)
许多Haskellers会考虑将最外面的ifs变成守卫:
func :: Int -> Int
func val
| val < 10 = let
a = getVal0
b = getVal1
in if val + a + b < 0
then 1
else 2
| val > 10 = let
a = getVal2
b = getVal3
in if val + a + b < 0
then 0
else 1
| otherwise = 99
Run Code Online (Sandbox Code Playgroud)