LINUX.ORG.RU

Простые вопросы по haskell

 ,


0

1

Всем привет! Почему не работает такой код

in_list :: a -> [a] -> Bool
in_list x [] = False
in_list x [c] = (x==c)
in_list x [c]++b = (x==c) || (in_list x b)

main = putStrLn( show(in_list 1 [1,2])) 
?

На команду

ghc second.hs
компилятор говорит
second.hs:4:1: Parse error in pattern: in_list

★★

Последнее исправление: CYB3R (всего исправлений: 1)

in_list :: (Eq a) => a -> [a] -> Bool
...
in_list x (c:cs) = (x==c) || (in_list x cs)

и про pattern matching почитай на RWH или haskell wiki

qnikst ★★★★★
()

++ склеивает два списка, и как ты хочешь, чтобы он разделил список [1,2,3,4,5]? тут же 6 вариантов. вот и ругается.

aptyp ★★★★
()

При паттерн-матчинге слева не может быть произвольная функция, только конструктор. (++) — не конструктор списка. У списков два конструктора: [] и (:). У тебя в первой альтернативе конструктор [], во второй — оба (а именно, там написано "(:) c []"), а в третьей написано "(++) ((:) c []) b"

И, кстати, вторая альтернатива не нужна, она — частный случай третьей.

Miguel ★★★★★
()
Последнее исправление: Miguel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.