簡體   English   中英

如何在Haskell中使用IO Double作為常規Double

[英]How to use IO Double as regular Double in Haskell

我必須遵循代碼

isInCircle::Double->Double->Bool
isInCircle p1 p2 = sqrt((p1*p1)+(p2*p2)) <= 1

當我打電話的時候

isInCircle (random :: Double) (random :: Double)

我收到這個錯誤

* 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

在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
  
        -- 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'

looks much more promising. 我們看到,而不是random ,對於Double看起來更有前途。 如果只有我們能以某種方式獲得Double “內部” IO Double類型的“價值”。 我們能做到嗎?

我們可以。 這就是“綁定”的用途。 do記號是用做<-

import System.Random 
main :: IO () 
main = do 
    -- if isInCircle (random :: Double) (random :: Double) 
     <- (randomIO :: IO Double)   -- thus, x :: Double
     <- (randomIO :: IO Double)   -- thus, y :: Double
    
       print "True"            -- print "True" :: IO ()
       print "False"           -- (if ... ...) :: IO ()

函數isInCircle本身不會改變也不需要。 它仍然是在兩個純值上運行的相同函數。 但是我們將它嵌入到一個組合的IO計算配方中,它由較小的IO計算配方(包括“內置” randomIO配方)構建,這樣當得到的組合(組合?)計算時 - 由名為main的值引用/描述 -執行時,它將使用 inInCircle函數和通過兩個randomIO獲得的兩個值。

那是Haskell。 純在里面,I / O在外面(以及如何人可以,如果不與我們溝通- 顧名思義 -通過I / O)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM