2014-12-16 3 views
0

Прошу прощения за мой простой мозг, но у меня проблемы с Haskell, особенно списками. Я попытался написать функцию, чтобы вернуть все подстроки заданной длины n (это будет уменьшаться на единицу при каждом вызове функции, начиная с длины исходной строки - 1) строки (без импорта модулей). Я написал следующий кодПонимание списков в Haskell

allSubs :: Int -> Int -> String -> [String] 
allSubs x n s 
    |n > x  = (take n (drop x (tail s))) : allSubs (x+1) n s 

Я не ожидая помощи с логикой или робастности моего кода, независимо от того, как недостатки. Но я хотел бы знать, если какой-либо список даже создается. Я только предварительно закодированы в C, где я мог бы просто ввести

else { return listx } 

или что-то, но в этом случае, что бы имя списка быть? и если бы я хотел использовать этот список в другой функции, например, если я хотел найти повторный строку в списке с помощью функции findRep я мог бы написать

|otherwise = findRep list 

Любые советы будут оценены.

+1

Если функция должна возвращать все подстроки строки, не должен он брать только один аргумент (сама строка)? Каковы первые два аргумента ('x' и' n') вашей функции 'allSubs', которая должна быть? – Jubobs

+0

Мое намерение состоит в том, что это будет небольшая функция более крупной программы, которая возвращает самую длинную повторяющуюся подстроку строки. X начнется с 0, n будет длиной строки - 1, затем -2 и т. Д. –

+0

Используете ли вы 'ghci'? Просто запустите свою функцию с некоторыми тестовыми значениями. Или скомпилируйте и запустите этот однострочный шрифт: 'main = print $ allSubs 3 4" humma "' Конечно, вы должны выполнить определение своей функции, предоставив код для случая «othewise». – ErikR

ответ

1

Концептуально:

all substrings of (x:xs) = (all substrings beginning at position 0) ++ 
          (all substrings of xs) 

таким образом, есть две функции, связанные: «все подстроки» и «все подстроки, начиная с позиции 0». Назовем их allsubs и pos0.

Теперь рассмотрим, как вы определили бы pos0 рекурсивно:

  • пустую строку только подстроки, начиная с позиции 0 является пустая строка
  • для (x:xs) мы можем иметь либо пустую строку или пусть ys быть член pos0 xs и перед именем x к нему

Теперь вы просто должны перевести эту спецификацию на Haskell.

Собираем все вместе:

allsubs "" = ??? 
allsubs (x:xs) = pos0 (x:xs) ++ allsubs xs 

pos0 "" = ??? 
pos0 (x:xs) = [ "" ] ++ ??? 
+0

Хотя ваше решение может быть более эффективным и эффективным. –

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