2015-12-23 1 views
3
movex [] a s = []  
movex (x:xs) a s 
| elem a x = moveNow x a s 
| otherwise = x : (movex xs a s) 
where 
    moveNow x a s 
    | s == 'l' = moveNow2 x a 
    where 
     moveNow2 [] _ = [] 
     moveNow2 (x:y:xs) a 
      | x == ' ' && y == a = a : x : moveNow2 (y:xs) a 
      | otherwise = x : moveNow2 (y:xs) a 

< - Это то, что я получил прямо сейчасHaskell пытается мутировать строку в [String]

Я пытаюсь сделать функцию, которая перебирает [строки], находит правильную строку, а затем мутирует его ,

данный вход

func ["abc", "dfg"] f l -- move f in this list 1 space left -- 

ожидается выход

["abc", "fdg"] 

Прямо сейчас я застрял на функции MOVEX, что дает мне ошибку

Couldn't match expected type `Char' with actual type `[Char]' 
In the first argument of `(:)', namely `x' 
In the expression: x : (movex xs a s) 
+0

'| elem a x = moveNow x a s', но как насчет xs? Как вы можете отказаться от него? Возможно, попробуйте предоставить свои функции явным типам подписей. –

+0

Каково использование этого условия 'x == '''? – karakfa

+0

использование для условия 'x == ''' заключается в проверке, является ли x символом пробега или нет –

ответ

1

прямое решение ошибка заключается в замене line

| elem a x = moveNow x a s 

С

| elem a x = moveNow x a s : movex xs a s 

Или, вероятно,

| elem a x = moveNow x a s : xs 

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

Ваша moveNow функция имеет тип возвращаемого String или [Char], в то время как movex имеет [String] или [[Char]], поэтому компилятор жалуется.

Чтобы избежать таких проблем (или исправить их проще) рассмотреть писать явные сигнатуры типов, например, так:

movex :: [String]->String->String->[String] 
+0

Замена на '| elem a x = moveNow x a s: xs' то, что я был после. Благодаря! –