【发布时间】:2014-02-19 10:18:29
【问题描述】:
我是 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)] 这样的配对,那么我得到 p>
Just3 Point -6 3, Just3 Point 2 3, Just3 Point 1 -2
如何在此处更改类型。 现在我写了一个函数mayPoint:
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)]
【问题讨论】:
-
到目前为止你尝试过什么?你有什么想法如何解决这个问题吗?你不能“逃脱”
IOmonad,所以你所做的任何事情最终都会回到IO。作为建议,编写一个函数(Int, Int) -> Maybe3 Point并从那里开始 -
我的第一个想法是尝试将Point写入IO进程,但我不知道该怎么做。让我考虑一下你的建议。谢谢。
-
您希望
data Point x y = Point Int Int有什么用处?要么设为Point = Point Int Int,要么设为Point coord = Point coord coord(因此坐标类型也可以是例如Double),或者可能Point x y = Point x y(允许两个坐标都有不同的类型——尽管这对我来说似乎不是一个非常有用的想法)。也许最好的事情是一个简单的类型同义词,即type Point = (Int,Int)。 -
@jozefg 嗨,
(Int, Int) -> Maybe3 Point是什么意思,是类型还是什么? -
@Xie 是的。编写一个函数将元组转换为
Maybe3 Point+ 一些与mapM的管道,你应该会很好。
标签: haskell