2014-11-16 3 views
0

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

У меня есть эта функция.

foo :: String -> [String] 
foo = ... 

Теперь я хочу, чтобы эта функция использовалась дважды в строке. Поэтому при первом использовании он должен запускать foo с помощью String, который присваивается функции, а во втором - использовать каждую строку из [String], которая создается при первом запуске. Поэтому я догадался, что карта - лучшая функция для этого. Так я получил эту функцию теперь

f :: String -> [String] 
f w = map foo (foo w) 

Но compliler дает мне эту ошибку:

MyHaskell.hs:86:19: 
Couldn't match type `[Char]' with `Char' 
Expected type: String -> String 
    Actual type: String -> [String] 
In the first argument of `map', namely `edits1' 
In the expression: map edits1 (edits1 word) 

Я думаю, проблема в том, что моя функция Foo (String -> [String]) не работает с отображением ((a-> b) -> [a] -> [b]).

Как это исправить?

ответ

2

@alternative привел меня к этому ответу.

Мне нужно выполнить результат, чтобы в результате получить [String].

f :: String -> [String] 
f w = concat (map foo (foo w)) 
+2

который равен 'import Control.Monad; f = foo> => foo'. – user3237465

+0

также совпадает с 'concatMap foo. Foo'. –

+0

И в 10 раз более читаемый, чем решение 'foo> => foo'. – alternative

2

Вы были очень близки.

f :: String -> [[String]] 
f w = map foo (foo w) 

Вы только что получили неправильный тип подписи - если вы подаете foo к каждому элементу, каждый элемент становится [String] поэтому вам нужен вложенный список.

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