如何在Haskell中使用IO双精度作为常规双精度

如何在Haskell中使用IO双精度作为常规双精度,haskell,random,io,monads,do-notation,Haskell,Random,Io,Monads,Do Notation,我必须遵循以下代码 isInCircle::Double->Double->Bool isInCircle p1 p2 = sqrt((p1*p1)+(p2*p2)) <= 1 我得到这个错误 * Couldn't match expected type `Double' with actual type `g0 -> (a0, g0)' 如果我将isInCircle函数的参数更改为IO Double,我将得到sqrt的错误,并添加 你能帮我吗?我的代码: impor

我必须遵循以下代码

isInCircle::Double->Double->Bool
isInCircle p1 p2 = sqrt((p1*p1)+(p2*p2)) <= 1
我得到这个错误

* Couldn't match expected type `Double' with actual type `g0 -> (a0, g0)'
如果我将
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
导入系统。随机
main::IO()
main=do
如果isInCircle(随机::双精度)(随机::双精度)
然后打印“真”
否则打印“假”
isInCircle::Double->Double->Bool

isInCircle p1 p2=sqrt((p1*p1)+(p2*p2))在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'
纯函数
isInCircle
本身没有更改,也不需要更改。它仍然是在两个纯值上运行的同一纯函数。但我们将其嵌入一个组合的
IO
计算配方中,该配方是由较小的
IO
计算配方(包括“内置的”
randomIO
配方)构建而成的,因此当执行由名为
main
的值引用/描述的结果组合(合成?)计算时,它将使用INCIRCLE
中的纯函数
和通过两个
randomIO
s获得的两个值


那是哈斯克尔。内部是纯I/O,外部是I/O(根据定义,如果不是通过I/O,它如何与我们通信)。

我无法重现您所给出的代码所产生的错误,因此我无法帮助您。您必须包含实际导致此错误的代码。请阅读.import System.Random main::IO()main=do如果isInCircle(Random::Double)(Random::Double)然后打印“True”否则打印“False”isInCircle::Double->Double->Bool isInCircle p1 p2=sqrt((p1*p1)+(p2*p2))不要在评论中发布更新,你的问题是,这是一个产生数字的方法(或“动作”)。@luqui它是-2,因为在编辑之前,它没有提供足够的信息,因此根本无法回答。
> :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'
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 ()