Haskell 输入'let';具有多个let块
我试图用许多let语句定义一个函数,但在输入'let'时不断出现错误Haskell 输入'let';具有多个let块,haskell,syntax,Haskell,Syntax,我试图用许多let语句定义一个函数,但在输入'let'时不断出现错误parse error。我还是Haskell的新手,所以我看不出是什么导致了这个问题 以下是我的功能: myFunc :: ([String], Int) -> (Int, Int, Int) -> ([String], Int) nextGuess (prev_string, prev_int) (a1, a2, a3) = (new_string, new_int) let new_int_1 = if
parse error。我还是Haskell的新手,所以我看不出是什么导致了这个问题
以下是我的功能:
myFunc :: ([String], Int) -> (Int, Int, Int) -> ([String], Int)
nextGuess (prev_string, prev_int) (a1, a2, a3) = (new_string, new_int)
let new_int_1 = if a3 - a1 < 0
then prev_int
else (filter (myPred1 a3 prev_string) prev_int)
let new_int_2 = if a2 - a1 < 0
then new_int_1
else (filter (myPred2 a2 prev_string) new_int_1)
new_int = filter (myPred3 a1 prev_string) new_int_2
myFunc::([String],Int)->(Int,Int,Int)->([String],Int)
下一步(上一个字符串,上一个int)(a1,a2,a3)=(新字符串,新int)
设new_int_1=如果a3-a1<0
然后上一个
else(过滤器(myPred1 a3 prev_字符串)prev_int)
设new_int_2=如果a2-a1<0
然后是新的
else(过滤器(myPred2 a2上一个字符串)新的内部1)
new_int=过滤器(myPred3 a1 prev_字符串)new_int_2
我不会解释函数应该做什么,因为这与问题无关,我的主要问题是在第一个let
语句中有一个解析错误,我不知道为什么。问题是,在使用函数之后,您通过let
定义函数,但是,let
的目的正好相反
您可能想阅读本文,因为您可以在此处使用where
:
nextGuess (prev_string, prev_int) (a1, a2, a3) = (new_string, new_int)
where
new_int_1 = if a3 - a1 < 0
then prev_int
else (filter (myPred1 a3 prev_string) prev_int)
new_int_2 = if a2 - a1 < 0
then new_int_1
else (filter (myPred2 a2 prev_string) new_int_1)
new_int = filter (myPred3 a1 prev_string) new_int_2
或do符号
:
nextGuess (prev_string, prev_int) (a1, a2, a3) = do
let new_int_1 = if a3 - a1 < 0
then prev_int
else (filter (myPred1 a3 prev_string) prev_int)
let new_int_2 = if a2 - a1 < 0
then new_int_1
else (filter (myPred2 a2 prev_string) new_int_1)
let new_int = filter (myPred3 a1 prev_string) new_int_2
(new_string, new_int)
nextGuess(prev_string,prev_int)(a1、a2、a3)=do
设new_int_1=如果a3-a1<0
然后上一个
else(过滤器(myPred1 a3 prev_字符串)prev_int)
设new_int_2=如果a2-a1<0
然后是新的
else(过滤器(myPred2 a2上一个字符串)新的内部1)
让new_int=过滤器(myPred3 a1 prev_字符串)new_int_2
(新字符串,新整数)
问题在于,您在使用函数后通过let
定义函数,但let
的作用正好相反
您可能想阅读本文,因为您可以在此处使用where
:
nextGuess (prev_string, prev_int) (a1, a2, a3) = (new_string, new_int)
where
new_int_1 = if a3 - a1 < 0
then prev_int
else (filter (myPred1 a3 prev_string) prev_int)
new_int_2 = if a2 - a1 < 0
then new_int_1
else (filter (myPred2 a2 prev_string) new_int_1)
new_int = filter (myPred3 a1 prev_string) new_int_2
或do符号
:
nextGuess (prev_string, prev_int) (a1, a2, a3) = do
let new_int_1 = if a3 - a1 < 0
then prev_int
else (filter (myPred1 a3 prev_string) prev_int)
let new_int_2 = if a2 - a1 < 0
then new_int_1
else (filter (myPred2 a2 prev_string) new_int_1)
let new_int = filter (myPred3 a1 prev_string) new_int_2
(new_string, new_int)
nextGuess(prev_string,prev_int)(a1、a2、a3)=do
设new_int_1=如果a3-a1<0
然后上一个
else(过滤器(myPred1 a3 prev_字符串)prev_int)
设new_int_2=如果a2-a1<0
然后是新的
else(过滤器(myPred2 a2上一个字符串)新的内部1)
让new_int=过滤器(myPred3 a1 prev_字符串)new_int_2
(新字符串,新整数)
应采用以下格式
let pattern_1 = expression_1
pattern_2 = expression_2
...
in final_expression
在你的情况下,类似这样的事情:
myFunc :: ([String], Int) -> (Int, Int, Int) -> ([String], Int)
nextGuess (prev_string, prev_int) (a1, a2, a3) =
let new_int_1 = if a3 - a1 < 0
then prev_int
else (filter (myPred1 a3 prev_string) prev_int)
new_int_2 = if a2 - a1 < 0
then new_int_1
else (filter (myPred2 a2 prev_string) new_int_1)
new_int = filter (myPred3 a1 prev_string) new_int_2
in (new_string, new_int)
应该在表格中
let pattern_1 = expression_1
pattern_2 = expression_2
...
in final_expression
在你的情况下,类似这样的事情:
myFunc :: ([String], Int) -> (Int, Int, Int) -> ([String], Int)
nextGuess (prev_string, prev_int) (a1, a2, a3) =
let new_int_1 = if a3 - a1 < 0
then prev_int
else (filter (myPred1 a3 prev_string) prev_int)
new_int_2 = if a2 - a1 < 0
then new_int_1
else (filter (myPred2 a2 prev_string) new_int_1)
new_int = filter (myPred3 a1 prev_string) new_int_2
in (new_string, new_int)
其他人已经回答了let
..in
和之间的区别,其中
在此处。但是对于缩进,一个很好的经验法则是,如果你在布局关键词之后换行+缩进,比如do
,let
,where
,case
,of
,的话,你就不会遇到麻烦(也不需要做精细的对齐),其他人已经回答了let
..in
和where
之间的区别。但是对于缩进,一个很好的经验法则是,如果你在布局关键词之后换行+缩进,比如do
,let
,where
,case
,of
,等等,你就不会遇到麻烦(也不需要做精细的对齐)。