【发布时间】:2021-02-22 13:17:39
【问题描述】:
我是 Haskell 的新手,英语也不是我的第一语言,所以请不要因为一些拼写错误或问题表述不当而对这篇文章进行评分:对我来说,这是一场真正的斗争。
无论如何:我正在尝试生成随机坐标(Int,Int),然后在另一个 Haskell 函数中使用它。但是我在将 IO 函数结果“导出”到第二个纯类 Haskell 函数时遇到了一些问题。
这是一个我认为并希望能正确说明我的问题的例子:
genRandomPair = genRandNr
genRandNr :: IO (Int,Int)
genRandNr = do
firstRandom <- randomRIO (1,10)
secondRandom <- randomRIO (1,10)
return (firstRandom,secondRandom)
如果不是很明显,那是我的问题是从 genRandNr 到 genRandomPair 的越界。
我会非常感谢所有友好的输入。
请注意:非常高级的代码解释对我没有帮助,因为我处于初学者水平,直到一周前从未在 Haskell 中使用过 monads 或 IO。
【问题讨论】:
-
genRandNr是IO (Int, Int),但您将其键入为IO ()。另外,genRandCoord应该是什么? -
对不起@Aplet123,我编辑了那个。上面的函数主要是为了说明我希望 genRandomPair 和 genRandNr 有相同的结果。嗯,不完全一样。但我想使用 genRandomPair 中的结果。
-
您可以再次使用
do表示法:genRandomPair = do \ pair <- genRandNr \ -- do stuff with pair其中 `` 是一个新行,因为 cmets 不能有单独的行。 question and answer thread 和 this excellent chapter in Learn you a Haskell 您可能会发现其他有用的东西 -
@NoNameAgent 我认为您需要在
genRandomPair中向我们提供有关您想要做什么的更多信息。按原样(在编辑之后),您的代码应该可以工作。genRandomPair使用genRandNr,并具有IO (Int, Int)类型。您是否希望能够给genRandomPair类型(Int, Int)?那是做不到的;如果这是您的问题,那么答案可以详细说明为什么它不能那样工作,以及为什么您不需要这样做。但目前尚不完全清楚这是否是您所要求的。 -
不是
genRandomPair = genRandNr,而是do { (x,y) <- genRandNr ; z <- return ( genRandomPair (x,y) ) ; .... use `z` ....}。现在你的纯函数genRandomPair与随机生成的(x,y)对一起工作,insideIOdo块。您需要调用的所有其他纯函数,以相同的方式放入do。在 Haskell 中,您不会“从IO中获取值以将其提供给纯函数”,而是“将纯函数放入IO,以便它可以处理那里产生的值”。