Haskell:无法将预期类型[(Int,Int)]与实际类型IO [(Int,Int)]匹配

时间:2014-02-18 23:23:07

标签: haskell

我是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)]

1 个答案:

答案 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 ]