if even 2 then 10 else 11 -- works fine
if even 2 then let t = 10 else let s = 11 -- _:27: parse error on input 'else'
if even 2 then 10 else let s = 11 -- _:34 parse error (possibly incorrect indentation or mismatched brackets)
因为我想说我想用[[p]]编写类似的代码:
[ t | let e = [],
let o = p!!14, r <- [13,12..1],
if even r
then
let o = zipWith (+) (p!!r) (zipWith max e (drop 1 e))
t = o
else
e = zipWith (+) (p!!r) (zipWith max o (drop 1 o))
t = e ]
在加载时报告错误。 。 。 _:33:输入'else'
时解析错误答案 0 :(得分:3)
您似乎正在以命令方式为不同分支中的绑定分配不同的值。这在Haskell中不起作用,你必须代替绑定赋值内的条件,如下所示:
[ t | let e = [],
let o = p!!14,
r <- [13,12..1],
let t = if even r
then zipWith (+) (p!!r) (zipWith max e (drop 1 e))
else zipWith (+) (p!!r) (zipWith max o (drop 1 o))
]
请注意,if必须排队。它必须与=
在同一行开头,或者必须与下一行中的=
处于相同或更大的缩进级别。
我注意到的另一件事是e
总是[]
,我想这不是意图。
答案 1 :(得分:0)
if表达式中的then
和else
部分应该在Haskell中返回相同的类型。
它的语法是这样的:
if <condition> then <true-value> else <false-value>\
在您的示例中,除非您计划在if条件本身中使用该变量,否则无法使用let
。
LYAH很好地指出了与命令式语言相比,If条件的区别:
Haskell的if语句和if语句之间的区别 命令式语言是else部分在Haskell中是必需的。在 命令式语言,你可以跳过几个步骤,如果 条件不满足,但在Haskell的每个表达和功能 必须归还。
答案 2 :(得分:-1)
then
let o = zipWith (+) (p!!r) (zipWith max e (drop 1 e))
t = o
“in”关键字必须在“let”表达式之后