Должны ли записи быть избегать в Haskell?

Большинство Хаскелл уроки учить использовать do-нотацию для ИО.

Я тоже начинал с do-нотацию, но что делает мой код более похожим на императивный язык больше, чем язык ФП.

На этой неделе я видел, как учебник использовать IO с <$>

stringAnalyzer <$> readFile "testfile.txt"

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

main = do
    strFile <- readFile "testfile.txt"
    let analysisResult = stringAnalyzer strFile
    return analysisResult

И инструмент анализа журнала готовой без "делать".

Так что мой вопрос есть "следует избегать do-нотацию в любом случае?&и".

Я знаю, что может "сделать" сделает код лучше в некоторых случаях.

Кроме того, почему большинство обучающих Ио с "делать"?

На мой взгляд в <$> и в <*> делает код более ФП, чем ИО.

Комментарии к вопросу (3)

"делать" нотация в Haskell desugars в довольно простой способ.


do
  x 
Комментарии (2)

В мое мнение в <$> и в <*> делает код более ФП, чем ИО.

Хаскелл-это не чисто функциональный язык, потому что "выглядит лучше и". Иногда она это делает, часто это не'т. Причиной оставаясь функциональным не является его синтаксис, но его semantics. Она вооружает нас с ссылочной прозрачности, что делает его гораздо легче доказать инварианты, позволяет очень высокого уровня оптимизации, позволяет легко общего назначения писать код и т. д..

Ничего из этого не имеет много общего с синтаксисом. Монадические вычисления по-прежнему чисто функционально – независимо от того, вы пишете им "делать" нотации или С в <$>, в <*> и >>=, таким образом мы получаем Хаскелл's выгоды в любом случае.

Однако, несмотря на вышеупомянутые ФП-преимущества, он часто более интуитивным, чтобы думать об алгоритмах с императивом-как точку зрения – даже если вы'вновь привыкли к тому, как это реализуется посредством монад. В этих случаях "делать" нотация дает вам быстрое представление о том, что "Порядок исчисления и", то "данные" В, С "точки изменения с", но это'ы банально вручную desugar это в голову >>= версии, чтобы понять, что'ы происходит функционально.

Аппликативный стиль-это конечно здорово во многих отношениях, однако она по сути своей точке-бесплатный. Это часто хорошая вещь, но особенно в более сложные проблемы, это может быть очень полезно давать имена, чтобы "временный" переменных. При использовании лишь "ПС" и синтаксиса языка Haskell, это требует либо лямбда или явно именованные функции. У обоих есть хорошие примеры, но бывшие вводит довольно много шума в середине кода и последнее, а срывает на "Поток" и, поскольку она требует Где или давай перенести в другое место от того, где вы его используете. "делать", с другой стороны, позволяет ввести именованную переменную там, где это необходимо, без каких-либо шума.

Комментарии (1)

Я часто нахожу себя в первую очередь пишу монадических действий В делать нотации, потом рефакторинг это сводится к простой монаде (или functorial) выражение. Это происходит в основном, когда "делать" блок оказывается короче, чем я ожидал. Иногда я рефакторинг в противоположном направлении; это зависит от кода в вопрос.

Мое основное правило: если "делать" блок только пару строк он'ы, как правило, аккуратнее, как короткое выражение. Долго "делать" -блок, вероятно, более читаемым, как это, если вы можете найти способ, чтобы разбить его на более мелкие, более составного функции.


Как пример, здесь's, как мы можем превратить ваш многословный фрагмент кода в ваш простой.


main = do
    strFile 
Комментарии (1)

мы должны избежать делать записи в любом случае?

Я'd не сказать точно нет. Для меня самым важным критерием в таких случаях является для того чтобы сделать код читаемым и понятным, как много, как это возможно. "До" -нотация была введена, чтобы сделать монадическом код более понятным, и это главное. Конечно, во многих случаях, используя прикладных точка-бесплатная нотации чрезвычайно приятно, например, вместо


do
    f 
Комментарии (2)

Аппликативный стиль следует поощрять, потому что он сочиняет (и красивее). Монадическом стиле необходимо в определенных случаях. См https://stackoverflow.com/a/7042674/1019205 подробное объяснение.

Комментарии (0)

"делать" нотации-это просто синтаксический сахар. Это может быть избегать во всех случаях. Однако, в некоторых случаях заменяя делать с >>= и возвращение делает код менее читабельным.

Итак, на ваши вопросы:

"Мы должны избегать заявление в любом случае?&и".

Сосредоточиться на коде ясным и лучше читаемым. Используйте "сделать", когда он помогает, не иначе.

> и у меня еще вопрос, почему большинство учебников будет учить Ио с делать?

Потому что "делать" ИО делает код лучше читаемым во многих случаях.

Кроме того, большинство людей, кто начинает учить Хаскелл имеют императивного программирования. Уроки для начинающих. Они должны использовать стиль, который легко разобраться новичкам.

Комментарии (0)

Делать нотации расширяется до выражения с помощью функции(>>=)и(>>), Ида` выражение. Поэтому он не является частью ядра языка.

(>>=) и (>>) используются, чтобы объединить действия последовательно и они имеют значение, когда результат действия изменяет структуру следующие действия.

В примере, приведенном в вопросе, это не очевидно, поскольку есть только одно `действие ввода-вывода, поэтому никакой последовательности не требуется.

Рассмотрим, например, выражение


do x 
Комментарии (5)