If 语句使用 IO Int haskell
If statement using IO Int haskell
我有一个游戏,用户对电脑,我想随机选择谁开始游戏。我有
a = getStdRandom $ randomR (0, 1)
这会得到一个随机数 0 或 1。但是它是一个 IO Int
,所以我不能用 if 语句将它与
这样的数字进行比较
if a == 0 then userStarts else computerStarts
我试过比较IO Int
和IO Int
,但是不行,我也试过
Converting IO Int to Int
我是 Haskell 的新手,不知道如何处理。请求的代码详细信息:
randomNumber = getStdRandom $ randomR (0, length symbols - 5) -- this will be 0 or 1
randomNumber2 = getStdRandom $ randomR (0, length symbols - 5) -- according to
-- the solution I need another function returning IO int.
a = do
x <- randomNumber
randomNumber2 $ pureFunction x
我得到的错误:
• Couldn't match expected type ‘t0 -> IO b
with actual type ‘IO Int’
• The first argument of ($) takes one argument,
but its type ‘IO Int’ has none
In a stmt of a 'do' block: randomNumber2 $ pureFunction x
In the expression:
do x <- randomNumber
randomNumber2 $ pureFunction x
• Relevant bindings include
a :: IO b
(bound at Path:87:1)
randomNumber2 $ pureFunction x
Path:89:20: error:
Variable not in scope: pureFunction :: Int -> t0
randomNumber2 $ pureFunction x
不确定您的代码是什么样的,但您是否尝试过按照链接资源的建议(使用 do 块)进行操作?
do
(result, newGenerator) <- randomR (0, 1) generator
-- ...
这将使您可以访问 result
,它与 0
和 1
.
的类型相同
你能展示你得到的 code/the 错误吗?
当你说 a = getStdRandom $ randomR (0,1)
时,你就是在说 "let a be the action of getting a random value between 0 and 1"。你想要的是在某个函数的 do 块 a <- getStdRandom $ randomR (0,1)
中,即 "let a be the result of running the action of getting a random value between 0 and 1".
因此:
import System.Random
main :: IO ()
main = do
a <- getStdRandom $ randomR (0, 1 :: Int)
if a == 0 then userStarts else computerStarts
-- Placeholders for completeness
userStarts, computerStarts :: IO ()
userStarts = putStrLn "user"
computerStarts = putStrLn "computer"
N.B。我指定 1
是一个 int,否则编译器将不知道您是否想要一个随机 int、int64、double、float 或其他完全不同的东西。
编辑:@monocell 提出了一个很好的观点,即在一个范围内生成一个 int 只是为了获得一个布尔值有点间接。您可以直接生成一个布尔结果,这不需要范围:
a <- getStdRandom random
if a then userStarts else computerStarts
我有一个游戏,用户对电脑,我想随机选择谁开始游戏。我有
a = getStdRandom $ randomR (0, 1)
这会得到一个随机数 0 或 1。但是它是一个 IO Int
,所以我不能用 if 语句将它与
if a == 0 then userStarts else computerStarts
我试过比较IO Int
和IO Int
,但是不行,我也试过
Converting IO Int to Int
我是 Haskell 的新手,不知道如何处理。请求的代码详细信息:
randomNumber = getStdRandom $ randomR (0, length symbols - 5) -- this will be 0 or 1
randomNumber2 = getStdRandom $ randomR (0, length symbols - 5) -- according to
-- the solution I need another function returning IO int.
a = do
x <- randomNumber
randomNumber2 $ pureFunction x
我得到的错误:
• Couldn't match expected type ‘t0 -> IO b
with actual type ‘IO Int’
• The first argument of ($) takes one argument,
but its type ‘IO Int’ has none
In a stmt of a 'do' block: randomNumber2 $ pureFunction x
In the expression:
do x <- randomNumber
randomNumber2 $ pureFunction x
• Relevant bindings include
a :: IO b
(bound at Path:87:1)
randomNumber2 $ pureFunction x
Path:89:20: error:
Variable not in scope: pureFunction :: Int -> t0
randomNumber2 $ pureFunction x
不确定您的代码是什么样的,但您是否尝试过按照链接资源的建议(使用 do 块)进行操作?
do
(result, newGenerator) <- randomR (0, 1) generator
-- ...
这将使您可以访问 result
,它与 0
和 1
.
你能展示你得到的 code/the 错误吗?
当你说 a = getStdRandom $ randomR (0,1)
时,你就是在说 "let a be the action of getting a random value between 0 and 1"。你想要的是在某个函数的 do 块 a <- getStdRandom $ randomR (0,1)
中,即 "let a be the result of running the action of getting a random value between 0 and 1".
因此:
import System.Random
main :: IO ()
main = do
a <- getStdRandom $ randomR (0, 1 :: Int)
if a == 0 then userStarts else computerStarts
-- Placeholders for completeness
userStarts, computerStarts :: IO ()
userStarts = putStrLn "user"
computerStarts = putStrLn "computer"
N.B。我指定 1
是一个 int,否则编译器将不知道您是否想要一个随机 int、int64、double、float 或其他完全不同的东西。
编辑:@monocell 提出了一个很好的观点,即在一个范围内生成一个 int 只是为了获得一个布尔值有点间接。您可以直接生成一个布尔结果,这不需要范围:
a <- getStdRandom random
if a then userStarts else computerStarts