【问题标题】:Haskell: Couldn't match expected type [(Int, Int)] with actual type IO [(Int,Int)]Haskell:无法将预期类型 [(Int, Int)] 与实际类型 IO [(Int,Int)] 匹配
【发布时间】: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)]

【问题讨论】:

  • 到目前为止你尝试过什么?你有什么想法如何解决这个问题吗?你不能“逃脱”IO monad,所以你所做的任何事情最终都会回到IO。作为建议,编写一个函数(Int, Int) -&gt; 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) -&gt; Maybe3 Point 是什么意思,是类型还是什么?
  • @Xie 是的。编写一个函数将元组转换为Maybe3 Point + 一些与mapM 的管道,你应该会很好。

标签: haskell


【解决方案1】:

有时用do 表示法更容易解决。

getNPairs n 的类型为IO [(Int,Int)],因此要获得对列表,我们需要使用&lt;-

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 ]

【讨论】:

  • 你好,我之前也想过do block,应该是sample。但是当我尝试你的建议时,它没有通过编译。
  • 谢谢!现在我知道如何处理这种问题了。
猜你喜欢
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2021-05-28
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
相关资源
最近更新 更多