Haskell сопоставление с образцом - неисчерпывающий образец - но почему? - PullRequest
1 голос
/ 07 марта 2020

Я пытаюсь создать функцию кодирования длин серий в Haskell. Я знаю, что есть много примеров, я не ищу решение, а скорее объясняю, почему мой не работает.

rle [] s acc = acc
rle (x:xs) s acc = rle xs s ((x, count x s) : acc)

count x = length . filter (x==)

По какой-то причине Haskell не может чтобы образец соответствовал этому. Например, rle "abcd" "aaa" [] должен возвращать [('a',3),('b',0),...], но всегда вызывает исключение неисчерпывающих шаблонов.

Я что-то упускаю здесь очевидное?

1 Ответ

2 голосов
/ 07 марта 2020

Я предполагаю, что вы определили это в ghci. Если вы пишете функции, которые занимают несколько строк, вы должны окружить их :{ и :}. Если вы делаете , а не , вы определяете две функции rle. Второй будет более локальным, поэтому, если вы позже позвоните rle, он выберет этот.

Например:

$ ghci
GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/kommusoft/.ghci
Prelude> :{
Prelude| rle [] s acc = acc
Prelude| rle (x:xs) s acc = rle xs s ((x, count x s) : acc)
Prelude| 
Prelude| count x = length . filter (x==)
Prelude| :}
Prelude> rle "abcd" "aaa" []
[('d',0),('c',0),('b',0),('a',3)]

Однако работа с count будет не работает здесь, так как ваш rle каждый раз делает один шаг в списке. Кроме того, вы не должны использовать аккумулятор.

...