Haskell中的Let语法
我为问题10编写了以下解决方案: 我想重写相同的解决方案,但这次使用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 (
{-- 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