Запустите два блока в файле Haskell с помощью runghc - PullRequest
0 голосов
/ 03 августа 2020

Я создал функцию (doLogMap), которая выполняет другую функцию (logMap) и распечатывает результаты. Однако попытка заставить doLogMap вызвать doLogMap рекурсивно приводит к следующей ошибке. звонок без полиграфических работ). Кроме того, строка in print newpops doLogMap rate newpops в сообщении об ошибке предполагает, что операторы print и doLogMap были объединены. Вопрос в том, как этого избежать?

Код: (logMap.hs)

logMap          :: Double -> Double -> Double
logMap 0 0      = 0
logMap rate 0   = 0
logMap 0 pop    = 0
logMap rate pop = rate * pop * (1 - pop)

doLogMap             :: Double -> [Double] -> IO()
doLogMap rate pops = let prev = last pops in
                         let newpops = pops ++ (logMap rate prev : []) in
                             print newpops 
                             doLogMap rate newpops

main :: IO()
main = do
    let r = 2.6
        x = 0.4 in
        let ys = (logMap r x) : [] in
            doLogMap r ys

1 Ответ

0 голосов
/ 03 августа 2020

Чтобы выполнять одно действие ввода-вывода за другим, используйте блок do (или какой-нибудь оператор монади c, например >> и >>=). Например,

doLogMap :: Double -> [Double] -> IO ()
doLogMap rate pops = do
   let prev    = last pops
       newpops = pops ++ [logMap rate prev]
   print newpops
   doLogMap rate newpops

Обратите внимание, что это будет l oop навсегда. Это также не очень эффективно, но если ваш список pops короткий, он не будет сильно бормотать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...