Вы должны включить сигнатуры типов для всех имен верхнего уровня в вашей программе. если вы их не знаете, загрузите файл и спросите GHCi: Main> :t randomList
. Затем скопируйте и вставьте его в файл (или сначала настройте его по своему усмотрению). Поместите сигнатуру типа над именем, которое она описывает.
GHCI говорит
randomList ::
(System.Random.Random t, Num t, Num a, Eq a) => a -> IO [t]
но вы, скорее всего, имели в виду
randomList :: (System.Random.Random t, Num t) => Int -> IO [t]
randomList 0 = return []
randomList n = do
r <- randomRIO (1,6) -- randomRIO (1,6) :: IO t , r :: t
rs <- randomList (n-1) -- rs :: [t]
return (r:rs) -- r :: t , rs :: [t]
В целом,
randomRIO (1,6) :: (System.Random.Random a, Num a) => IO a
Вы бросаете шестигранный кубик n
раз и записываете результаты в список. Кстати то же самое делает
sequence $ replicate n (randomRIO (1,6))
===
replicateM n (randomRIO (1,6))
> :t \n -> replicateM n (randomRIO (1,6))
:: (System.Random.Random a, Num a) => Int -> IO [a]
Затем GHCi также сообщает нам, что
quicksort :: Ord t => [t] -> [t]
Но randomList n
это IO [t]
, а не [t]
. Чтобы получить значение [t]
внутри IO [t]
, вам нужно сделать это внутри:
sortRandom :: (Ord t, Monad m) => m [t] -> m [t]
sortRandom randomlist = do
xs <- randomlist -- randomlist :: IO [t] , xs :: [t]
let ys = quicksort xs
return ys
Вышесказанное можно сократить до
sortRandom :: (Ord t, Monad m) => m [t] -> m [t]
sortRandom = liftM quicksort -- for monads
or
sortRandom :: (Ord t, Functor f) => f [t] -> f [t]
sortRandom = fmap quicksort -- for functors
в зависимости от того, что вы предпочитаете. Оба работают с IO
, который является монадой, и любая монада также является функтором. Итак, в конце концов, вы можете определить
foo :: Int -> IO [Int]
foo n = liftM quicksort $ replicateM n (randomRIO (1,6))
person
Will Ness
schedule
20.04.2019
fmap quicksort (randomList 10)
. - person Willem Van Onsem   schedule 20.04.2019Main> :t randomList
. Затем скопируйте и вставьте его в файл (или сначала настройте его по своему усмотрению). Поместите сигнатуру типа над именем, которое она описывает. - person Will Ness   schedule 20.04.2019