[英]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.