Список префиксов в haskell

Я должен написать функцию, которая возвращает список всех префиксов данной строки.

Вот где я сейчас нахожусь.

prefixess [x] [] = [x]
prefixess [] s = prefixess [s] s
prefixess [x] s  = prefixess [x, (init s)] (init s)
prefixes s = prefixess [] s

Он компилируется, но когда я пытаюсь запустить его на строке, я получаю это:

Couldn't match type ‘Char’ with ‘[t]’
Expected type: [[t]]
  Actual type: [Char]
Relevant bindings include
  it :: [t] -> [[t]] (bound at <interactive>:18:1)
In the first argument of ‘prefixess’, namely ‘"abcde"’
In the expression: prefixess "abcde"
In an equation for ‘it’: it = prefixess "abcde"

У меня нет идей. Есть намеки?

1 ответ

Я не думаю, что этот код делает то, что вы думаете, что он делает. Вы пытаетесь сопоставить шаблону список x с шаблоном [x], который захватывает элемент одноэлементного списка. Если я исправлю ваш код следующим образом, он будет работать:

prefixess x [] = x
prefixess [] s = prefixess [s] s
prefixess x s  = prefixess ((init s):x) (init s)
prefixes s = prefixess [] s

Это дает следующий результат:

Main> prefixes "stackru"
["","s","st","sta","stac","stack","stacko","stackov","stackove","stackover","stackoverf","stackoverfl","stackoverflo","stackru"]

Но вам не нужен аккумулятор для функции, которая вычисляет префиксы, я бы написал так:

prefixes' (x:xs) = [] : (map (x:) (prefixes xs))
prefixes' [] = [[]]

Эта функция также доступна под именем "inits" в Data.List

Main> import Data.List
Main Data.List> inits "stackru"
["","s","st","sta","stac","stack","stacko","stackov","stackove","stackover","stackoverf","stackoverfl","stackoverflo","stackru"]

Бесточечное решение для генерации списка всех префиксов:

prefixes = foldr (\el acc -> [] : map (el:) acc) [[]] 
Другие вопросы по тегам