Haskell 输入'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

我试图用许多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 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
,等等,你就不会遇到麻烦(也不需要做精细的对齐)。