我是Haskell的新手,当我做练习时,我有一个函数可以从[-10,10]得到随机对:
randomList :: IO [Int]
randomList = randomRs (-10, 10) `fmap` newStdGen
pairs :: IO [(Int, Int)]
pairs = liftM2 zip randomList randomList
getNPairs n = take n `fmap` pairs
<Main> getNPairs 3
[(-6,3),(2,3),(1,-2)]
我还定义了几种新类型:
data Point x y= Point Int Int deriving (Show)
data Bool3 = True3 | False3 | Unk3 deriving (Show)
data Maybe3 a= Just3 a | Unknown3 | Missing3 deriving (Show, Eq, Ord)
我怎么能得到一个将getNpair值放到Point的Maybe3(Point)列表。
如果我能得到像[(-6,3),(2,3),(1,-2)]
这样的对,那我就得到了
Just3 Point -6 3, Just3 Point 2 3, Just3 Point 1 -2
如何更改此处的类型。 现在我写一个函数maybePoint:
getPoint (x,y) = Just3 (Point x y)
maybePoint n= map getPoint (getNPairs n)
但是节目是:Couldn't match expected type [(Int, Int)] with actual type IO [(Int,Int)]
答案 0 :(得分:1)
有时以do
表示法更容易理解。
getNPairs n
的类型为IO [(Int,Int)]
,因此要查看对象列表,我们需要使用<-
:
do ps <- getNPairs n -- ps has type [(Int,Int)]
...
现在我们有了一个列表,我们可以用getPoint
:
...
let points = map getPoint ps -- points has type [Just3 Point]
...
但是我们仍然在IO monad中,所以我们使用return
将这个纯值转换为monadic:
...
return points
此do
块的类型为IO [ Just3 Point ]
。