Как Вы используете Управление. Применимый, чтобы записать инструменту для очистки Haskell?

В недавнем ответе на вопрос о стиле записал я

main = untilM (isCorrect 42) (read `liftM` getLine)

и

isCorrect num guess =
  case compare num guess of
    EQ -> putStrLn "You Win!" >> return True
    ...

Martijn услужливо предложил альтернативы:

main = untilM (isCorrect 42) (read <$> getLine)

EQ -> True <$ putStrLn "You Win!"

Какие общие шаблоны в коде Haskell могут быть сделаны более четкими абстракциями использования из Управления. Применимый? Что полезные эмпирические правила состоят в том, чтобы иметь в виду для использования Управления. Применимый эффективно?

60
задан 4 revs, 3 users 63% 23 May 2017 в 12:25
поделиться

2 ответа

В основном монады также являются примерами функтора [1]. Итак, всякий раз, когда вы находитесь с использованием Liftm , , , , Anteftm2 и т. Д., Вы могли бы цепить вычисление вместе с использованием <*> . В некотором смысле вы можете подумать о заявительных функторах как аналогичных функциям. Чистая функция f может быть поднята с помощью f <$> x <*> y <*> z .

По сравнению с монамами, аппликативными функторами не могут выборочно выполнять свои аргументы. Побочные эффекты всех аргументов состоятся.

import Control.Applicative

ifte condition trueClause falseClause = do
  c <- condition
  if c then trueClause else falseClause

x = ifte (return True) (putStrLn "True") (putStrLn "False")

ifte' condition trueClause falseClause = 
  if condition then trueClause else falseClause

y = ifte' <$> (pure True) <*> (putStrLn "True") <*> (putStrLn "False")

x ТОЛЬКО ВЫЗОВЫ TRUE , тогда как y выводы true и false последовательно.

[1] TypeClassopedia . Настоятельно рекомендуется.

[2] http://www.soi.city.ac.uk/~ross/Papers/applicative.html . Хотя это академическая статья, не сложно следовать.

[3] http://lelearnyouahaskell.com/functors-applative-fockors-and- Anmonoids#applative-bockors . Объясняет дело очень хорошо.

[4] http://book.realworldhaskell.org/read/using-parsec.html#id652399 . Показывает, как монадическую библиотеку Parsec также можно использовать применительном образом.

44
ответ дан 24 November 2019 в 17:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: