2013-06-04 2 views
2
let countList (x:xs) = 1+countList xs 
let countList [] = 0 
countList [1,2,3] 
*** Exception: <interactive>:35:5-20: Non-exhaustive patterns in function countList 

Я думаю, что это слишком просто, чтобы получить ошибку, но ошибка все еще там Я в шокеHaskell, просто по шаблону получает ошибку

+0

Вы в шоке? К сожалению. – Raptor

+0

это правильно, когда я использую case-of для их соответствия – snow

ответ

12

Использование нескольких операторов let означает, что вы действительно определяете две функции, а второе определение - затенение первого. Таким образом, countList [1, 2, 3] генерирует исключение, поскольку определение, которое находится в области видимости, определяется только для [].

Вам необходимо определить оба уравнения одновременно с одним let. Вы можете либо ввести их в одну строку, разделяя случаи точкой с запятой

> let countList (x:xs) = 1 + countList xs; countList [] = 0 

или использовать многострочный синтаксис GHCI в :{ ... :}, убедившись, что для выравнивания второй countList с первым.

> :{ 
| let countList (x:xs) = 1 + countList xs 
|  countList [] = 0 
| :} 
+0

Я не знал о многострочном синтаксисе, спасибо .. – sinan

2

Я предполагаю, что вы работаете в GHCi. Проблема с вашим кодом заключается в том, что вы не определяете два случая совпадения шаблонов для одной функции, но вы просто переопределяете эту функцию. Таким образом, вы получаете замену let countList (x:xs) = 1+countList xs на let countList [] = 0, что на самом деле является не исчерпывающим шаблоном.

1

Вы переопределение countList функции вместо того, чтобы расширить существующее определение с большим количеством шаблонов охранниками. Я не уверен, есть ли способ сделать то, что вы хотите сделать, в GHCi (кроме использования case ... of ... выражений).

Смотрите также это: GHCi "let" -- what does it do?

0

Вы должны использовать позволить?
Если нет, это проще всего.

countList [] = 0 
countList (x:xs) = 1 + countList xs 

Условием 0 должно быть до общего состояния.

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