gpt4 book ai didi

Haskell IO Int 和 Int

转载 作者:行者123 更新时间:2023-12-02 02:50:09 25 4
gpt4 key购买 nike

我最近开始学习 Haskell。我正在尝试编写一个选择随机数组元素的程序:

import System.Random

randomInt :: (Int, Int) -> IO Int
randomInt range = randomRIO range :: IO Int

choseRandom :: [a] -> a
choseRandom list =
length list
>>=
(\l -> randomInt(0,l-1))
>>=
(\num -> (list !! num))

main :: IO ()
main = undefined

我收到以下错误:
Build FAILED

C:\Users\User\Haskell\Real\src\Main.hs: line 7, column 9:
Couldn't match expected type `IO Int' with actual type `Int'

In the return type of a call of `length'

In the first argument of `(>>=)', namely `length list'

In the first argument of `(>>=)', namely

`length list >>= (\ l -> randomInt (0, l - 1))'

我做错了什么?第一次处理单子(monad)对我来说很难

最佳答案

由于您在 choseRandom 内部使用 IO您需要更改类型签名:

choseRandom :: [a] -> IO a

其次,您不需要使用 >>=获取列表的长度。 >>=有类型
Monad m => m a -> (a -> m b) -> m b
length的类型是 [a] -> Int ,所以 length list 的类型是 Int ,这不是单子(monad)。

调用 randomInt时可以直接计算:
choseRandom :: [a] -> IO a
choseRandom list =
randomInt(0, length list) >>= (\num -> return (list !! num))

这与
choseRandom :: [a] -> IO a
choseRandom list = fmap (\num -> (list !! num)) (randomInt(0, length list))

关于Haskell IO Int 和 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23151170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com