Haskell中的Let语法

Haskell中的Let语法,haskell,indentation,Haskell,Indentation,我为问题10编写了以下解决方案: 我想重写相同的解决方案,但这次使用let语法 {-- using dropWhile and takeWhile / more readable --} enc' :: (Eq a) => [a] -> [(Int, a)] enc' [] = [] enc' (x:xs) = let num = length $ takeWhile (==x) (x:xs) rem = dropWhile (==x) (x:xs) in (

我为问题10编写了以下解决方案:

我想重写相同的解决方案,但这次使用let语法

{-- using dropWhile and takeWhile / more readable --}
enc' :: (Eq a) => [a] -> [(Int, a)]
enc' [] = []
enc' (x:xs) = let num = length $ takeWhile (==x) (x:xs)
      rem = dropWhile (==x) (x:xs)
      in (num, x) : enc' rem
第二个例子不起作用。错误是:

*Main> :l Problem10.hs
Compiling Main             ( Problem10.hs, interpreted )

Problem10.hs:16:38: parse error on input `='
Failed, modules loaded: none.
其中第16行是这一行:
rem=dropWhile(=x)(x:xs)

有什么建议吗


乐:是的,这是一个缩进问题。似乎我的编辑器(Notepad++)应该配置一点以避免类似的问题。

正如@templatetypedef指出的,它实际上是缩进。
rem=
需要与
num=

对齐,如前所述,这是一个缩进问题,其原因是以
rem
开头的行比前一行缩进更少,因此它不会被解析为属于前一
let
语句。确定如何在Haskell中缩进的一个好方法是from

另外,在使用
let
语句启动函数时,最好换一行,以避免出现大缩进,如下所示:

enc :: (Eq a) => [a] -> [(Int, a)]
enc []     = []
enc (x:xs) = 
  let num = length . takeWhile (==x) $ x:xs
      rem = dropWhile (==x) (x:xs)
  in (num, x) : enc rem

这可能是缩进错误吗?您可能需要将let语句后面的其余行向前推以匹配。不过,我不确定这是否是罪魁祸首。
enc :: (Eq a) => [a] -> [(Int, a)]
enc []     = []
enc (x:xs) = 
  let num = length . takeWhile (==x) $ x:xs
      rem = dropWhile (==x) (x:xs)
  in (num, x) : enc rem