Haskell 哈斯克尔:不能';t将预期类型[(Int,Int)]与实际类型IO[(Int,Int)]匹配

Haskell 哈斯克尔:不能';t将预期类型[(Int,Int)]与实际类型IO[(Int,Int)]匹配,haskell,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

我是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)]
如何获得将getNpair值设置为Point的Maybe3(Point)列表。
例如,如果我能得到像
[(-6,3),(2,3),(1,-2)]
这样的配对,那么我得到

Just3 Point -6 3, Just3 Point 2 3, Just3 Point 1 -2
如何在此处更改类型。 现在我写一个函数,可能是点:

getPoint (x,y) = Just3 (Point x y)
maybePoint n= map getPoint (getNPairs n)

但是显示:
无法将预期类型[(Int,Int)]与实际类型IO[(Int,Int)]匹配。
有时用
do
表示法更容易计算出来


getNPairs n
的类型为
IO[(Int,Int)]
,因此要获得配对列表,我们需要使用
到目前为止您尝试了什么?你有什么办法来解决这个问题吗?您无法“逃逸”
IO
单子,因此您所做的任何事情最终都会返回
IO
。作为建议,编写一个函数
(Int,Int)->可能是3点
,然后从这里开始我的第一个想法是尝试将该点写入IO进程,但我不知道怎么做。让我考虑一下你的建议。谢谢。你认为
数据点xy=pointint
有什么好处?要么将其设置为
Point=Point Int
,要么设置为
Point coord=Point coord
(因此,如果您愿意,坐标类型也可以是
Double
),或者可能设置为
Point xy=Point xy
(允许两个坐标具有不同的类型,尽管这对我来说不是一个非常有用的想法)。也许最好是一个简单的类型synomym,即
类型Point=(Int,Int)
@jozefg嗨,你说的
(Int,Int)->可能是3点
,是类型还是什么?@Xie是的。编写一个将元组转换为
的函数可能是3点
+使用
mapM
的一些管道,你应该很好。嗨,我以前也考虑过do block,它应该是示例。但是当我尝试你的建议时,它没有通过编译。谢谢!现在我知道如何处理这种问题了。
getPoint (x,y) = Just3 (Point x y)
maybePoint n= map getPoint (getNPairs n)
do ps <- getNPairs n             -- ps has type [(Int,Int)]
   ...
   ...
   let points = map getPoint ps  -- points has type [Just3 Point]
   ...
   ...
   return points