В Haskell, как мне рекурсивно манипулировать кортежем и предварительно добавить символ к первому элементу кортежа? - PullRequest
1 голос
/ 02 ноября 2009

Тип этой функции: function :: Num a => ([Char],a) -> ([Char],a)

Мой ввод для этой функции будет примерно таким: (".'*",0), и функция найдет первые '.' или '*' и обновит a, добавив 200 или 400 к значению a в зависимости от того, какой символ был заменен первым. Как только что-то изменяется, остальная часть списка символов добавляется в конец (изменился только один символ). Если главный символ не изменен, обработайте остальную часть списка, но сохраните главный символ.

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

function ([], a) = ([], a)
function ((x:xs), a)
    | x == '.' = ('-':xs, a+200)
    | x =='*' = ('-':xs, a+400)
    | otherwise = function(xs, a) --how do I put the unchanged x before xs without processing it?

В основном, когда функция получает в противном случае, мне нужно обработать остаток списка символов, но неизмененные символы также должны быть возвращены.

Примеры желаемого ввода вывода:

Main> function ("./-", 0)
("-/-",200)

или

Main> function ("-/-", 0)
("-/-",0)

Любая помощь очень ценится! Я уточню, если это неясно. Я чувствую, что решаю эту проблему неправильно.

1 Ответ

9 голосов
/ 02 ноября 2009

Вы забываете, что function :: Num a => ([Char],a) -> ([Char],a), когда вы делаете это:

    | otherwise = function(xs, a)

Вместо этого вы хотите что-то более похожее на

    | otherwise = let (xss, b) = function(xs, a)
                              in (x:xss, b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...