Я новичок в Haskell, и у меня действительно проблемы со всем этим IO.
Я пытаюсь выяснить, сколько времени требуется для просмотра списка в haskell. Я хотел сгенерировать список случайных чисел и передать его в качестве параметра функции, чтобы я мог распечатать каждый элемент списка. Я использую пакет CRITERION для теста. Вот код:
{-# LANGUAGE OverloadedStrings #-}
import System.Random
import Control.Exception
import Criterion.Main
printElements [] = return ()
printElements (x:xs) = do print(x)
printElements xs
randomList 0 = return []
randomList n = do
x <- randomRIO (1,100)
xs <- randomList (n-1)
return (x:xs)
main = defaultMain [
bgroup "printElements" [ bench "[1,2,3]" $ whnf printElements (randomList 10)
, bench "[4,5,6]" $ whnf printElements [4,5,6,4,2,5]
, bench "[7,8,9]" $ whnf printElements [7,8,9,2,3,4]
, bench "[10,11,12]" $ whnf printElements [10,11, 12,4,5]
]
]
Ошибка при запуске кода:
listtraversal.hs:18:67:
Couldn't match expected type ‘[a0]’ with actual type ‘IO [t0]’
In the second argument of ‘whnf’, namely ‘(randomList 10)’
In the second argument of ‘($)’, namely
‘whnf printElements (randomList 10)’
randomList 10 >>= whnf printElements
также можно записать какdo { list <- randomList 10; whnf printElements list }
илиwhnf printElements =<< randomList 10
, что немного проясняет, что bind является оператором приложения (применяет нечистую функцию к нечистому аргументу), подобно$
(чистая функция к чистому аргументу) и<$>
(чистая функция для нечистого аргумента). 23.05.2018