2013-10-07 2 views
2

Теперь в библиотеках Haskell может быть что-то сделать, что я хочу. Мне достаточно noob, чтобы не знать ничего лучше, и я пытаюсь написать пользовательскую функцию карты, используя инструменты, которые я знаю. Тип подпись должна бытьЗапись пользовательской функции карты

myMap :: (Monad m) => (a -> b) -> [m a] -> [m b] 

myMap f as где возвращает список после применения f для каждого значения в каждой монаде в as.

Моя первая попытка была

myMap f = map (\x x >>= f) 

Однако это имеет тип подписи

myMap :: (Monad m) => (a -> m b) -> [m a] -> [m b] 

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

Связанные Вопрос:

Mapping a function over two input lists

ответ

5

Если вы можете превратить ваш (a -> b) функцию, чтобы m a -> m b тогда вы могли бы использовать map сам. Итак, что вам нужно сделать? Hoogle неплохо подходит для такого рода вещей. Выполнение поиска для (a -> b) -> (m a -> m b) дает следующие результаты:

http://www.haskell.org/hoogle/?hoogle=%28a+-%3E+b%29+-%3E+%28m+a+-%3E+m+b%29

В верхней являются fmap (которые используют Functor) и liftM (которые используют Monad). Так или иначе, но вы используете монады, так что давайте пойдем с liftM. Таким образом:

myMap :: Monad m => (a -> b) -> [m a] -> [m b] 
myMap f = map (liftM f) 
+1

И это может быть ет уменьшено. – augustss

+0

Похоже, 'liftM' - это функция библиотеки, которую я искал. –

2

Вы были почти там в вашей попытке, что вы пропали без вести был return:

myMap :: (Monad m) => (a -> b) -> [m a] -> [m b] 
myMap f = map $ flip (>>=) $ return . f 

В основном вам нужен способ

  • разворачивать a из m a - мы используем >>= для этого
  • применяется f к нему
  • завернуть f возвращаемого значение в m, чтобы получить m b - мы используем return для этого
+0

+1 Спасибо за объяснение того, как изменить свое решение. –

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