如何在Haskell中使用IO Double作为常规Double

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)

Wil*_*ess 7

在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).