Haskell 哈斯克尔:不能';t将预期类型[(Int,Int)]与实际类型IO[(Int,Int)]匹配
我是Haskell的新手,当我做这个练习时,我有一个函数可以从[-10,10]中获得随机配对: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
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