2011-01-11 2 views
3

Я написал следующее решение для задачи 10 (99 questions) in Haskell:Пусть синтаксис Haskell

{-- using dropWhile and takeWhile --} 
enc :: (Eq a) => [a] -> [(Int, a)] 
enc [] = [] 
enc (x:xs) = (length $ takeWhile (==x) (x:xs), x) : enc (dropWhile (==x) xs) 

Я хотел переписать то же самое решение, но на этот раз с помощью синтаксиса 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)

Любые предложения?

LE: Да, это была проблема с отступом. Кажется, что мой редактор (Notepad ++) должен быть настроен немного, чтобы избежать подобных проблем.

+3

Может быть, это ошибка отступы? Возможно, вам придется нажать остальные строки после того, как оператор let будет соответствовать. Не уверен, что это преступник. – templatetypedef

ответ

7

Как уже упоминалось, это проблема с отступом, вызванная линией, начинающейся с rem, с меньшей отступом, чем предыдущая строка, поэтому она не анализируется как принадлежащая предыдущему оператору let. Хорошим способом определения того, как отступ в Haskell является offside rule от Real World Haskell.

Также часто является хорошей идеей, чтобы упасть на новую строку при запуске функции с 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 
4

Как @templatetypedef указывает, это is действительно отступы. rem = необходимо выровнять с num =.

Смежные вопросы