2015-07-15 2 views

ответ

1

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

Однако, есть обобщение liftM2 с использованием операторов из Control.Applicative, которые могут найти интересные:

liftM2 f a b = f <$> a <*> b 
liftM3 f a b c = f <$> a <*> b <*> c 
liftM4 f a b c d = f <$> a <*> b <*> c <*> d 

(Технически, это применимо только если вашей Монада также Аппликативная, но по GHC 7.10, все Монады Аппликативный)

и т. Д. Стоит изучить типы, чтобы выяснить, как работают эти выражения.

+0

Вы должны иметь в виду 'liftM2',' liftM3' и 'liftM4', скорее. Кроме того, определения, которые вы даете, - это слова 'liftA2',' liftA3' и 'liftA4'. См. Http://hackage.haskell.org/package/base-4.8.0.0/docs/src/GHC-Base.html#liftM2 – Jubobs

+0

Правильно, я поменял «М» вокруг; опасность ответа с мобильного устройства. Но что касается разницы между 'liftA2' и т. Д. И' liftM2', вот что я имел в виду в комментарии о ghc 7.10. После реализации AMP все правильно определенные Monads имеют 'liftM2', определенные как' liftA2' и т. Д. –

+0

Несмотря на то, что AMP вступает в силу, функция 'liftMn' по-прежнему реализуется в монадических терминах в' base'; см. https://github.com/ghc/ghc/blob/b98ca17e12c7efdc906f4901f25e6263a5399be1/libraries/base/GHC/Base.hs#L566 – Jubobs

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