Evi*_*ius 4 random io monads haskell do-notation
我必须遵循代码
isInCircle::Double->Double->Bool
isInCircle p1 p2 = sqrt((p1*p1)+(p2*p2)) <= 1
Run Code Online (Sandbox Code Playgroud)
当我打电话的时候
isInCircle (random :: Double) (random :: Double)
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
* Couldn't match expected type `Double' with actual type `g0 -> (a0, g0)'
Run Code Online (Sandbox Code Playgroud)
如果我将isInCircle函数的参数更改为IO Double我得到错误sqrt并添加...
你能帮助我吗?我的代码:
import System.Random
main :: IO ()
main = do
if isInCircle (random :: Double) (random :: Double)
then print "True"
else print "False"
isInCircle::Double->Double->Bool
isInCircle p1 p2 = sqrt((p1*p1)+(p2*p2)) <= 1
Run Code Online (Sandbox Code Playgroud)
在GHCi提示下检查出来,
> :i Random
class Random a where
randomR :: RandomGen g => (a, a) -> g -> (a, g)
random :: RandomGen g => g -> (a, g)
randomRs :: RandomGen g => (a, a) -> g -> [a]
randoms :: RandomGen g => g -> [a]
randomRIO :: (a, a) -> IO a
randomIO :: IO a
-- Defined in `System.Random'
instance Random Integer -- Defined in `System.Random'
instance Random Int -- Defined in `System.Random'
instance Random Float -- Defined in `System.Random'
instance Random Double -- Defined in `System.Random'
instance Random Char -- Defined in `System.Random'
instance Random Bool -- Defined in `System.Random'Run Code Online (Sandbox Code Playgroud)
我们看到的不是random,对Double,看起来更加有前途.只要我们能以某种方式获得"内部"的"价值"类型.我们能做到吗?randomIO :: IO DoubleDoubleIO Double
我们可以.这就是"绑定"的用途.在do表示法中,它完成了<-:
import System.Random
main :: IO ()
main = do
-- if isInCircle (random :: Double) (random :: Double)
x <- (randomIO :: IO Double) -- thus, x :: Double
y <- (randomIO :: IO Double) -- thus, y :: Double
if isInCircle x y
then print "True" -- print "True" :: IO ()
else print "False" -- (if ... ...) :: IO ()Run Code Online (Sandbox Code Playgroud)
该纯函数isInCircle本身没有改变,也不需要是.它仍然是在两个纯值上运行的相同纯函数.但是我们将它嵌入到一个组合IO计算配方中,它是根据较小的IO计算配方(包括"内置" randomIO配方)构建的,这样当得到的组合(组合?)计算 - 由名为main- 的值引用/描述时,它就会执行将使用的纯函数inInCircle与通过两个获得的两个值randomIO秒.
那是Haskell.纯在里面,I/O在外面(以及如何人可以,如果不与我们沟通- 顾名思义 -通过I/O).