Haskell mapM_ не печатает

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

import Data.Functor ((<&>))

supportedPairs :: IO (Maybe [(String, String)])
forex :: String -> String -> IO (Maybe (Scientific, UnixTime))


main :: IO ()
main = do
    x <- supportedPairs
    mapM_ (flip (<&>) print . uncurry forex) (fromJust x)
    -- this prints nothing at all

Одиночные вызовы работают просто так:

main = do
    x <- supportedPairs    
    u <- (uncurry forex . (flip (!!) 10 . fromJust)) x
    print u
    -- this prints "Just (438.685041,UnixTime {utSeconds = 1649588583, utMicroSeconds = 0})"

Почему mapM_ не печатает результаты, хотя они оцениваются? Если я правильно понял лень Haskell, то, если результаты не должны быть напечатаны, их не следует оценивать в первую очередь?

Чи объясняет это правильно, но я должен отметить, что flip (<&>) обычно пишется fmap. Вы также должны проверить оператор (<$>).

dfeuer 10.04.2022 14:06

Спасибо, я этого не знал! Я думаю, это то, что происходит, когда вы пытаетесь изучить Haskell с нуля :)

Fabus1184 10.04.2022 16:10
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проверьте типы:

print есть ... -> IO ().

Следовательно, ... <&> print есть IO (IO ()). Обратите внимание на двойной ввод-вывод здесь.

Следовательно, сопоставление с этим запустит «самый внешний ввод-вывод», но не «самый внутренний ввод-вывод». Более конкретно, сравните это:

main = do
  x <- print True >> return 5          -- x is 5
  y <- return (print True >> return 5) -- y is an IO action
  ...

Здесь выполняется только первое print True: второе действие ввода-вывода используется для определения y, но пока мы не запустим y, оно не будет выполнено.

И последнее: здесь вам не нужно <&>, так как это создает вложенные IO. Используйте flip (>>=) print (или (=<<) print, или (>>= print)) вместо flip <&> print.

Другие вопросы по теме