翻译此代码的任务列表
f = do
c <- [1 .. 200]
b <- [1 .. 200]
guard (c >= b)
a <- [1 .. 200]
guard (a >= b && (c^2 - a^2 == b^2))
return (a,b, c)变成了一种无糖的苦味剂。
我想我已经解决了大部分问题,但我被困在中间,因为我需要解决一个问题,然后才能继续。到目前为止,我有:
f = [1 .. 200] >>= \c ->
[1 .. 200] >>= \b ->
if (c >= b)
then [1 .. 200] >>= \a -> if (a >= b && (c^2 - a^2 == b^2))
then return(a,b,c)
else return ()
else return ()它不能编译。当我输入(a,b,c)作为返回值时,它会编译,但显然它不再给出预期的结果。如何在else分支中返回"nothing“?
如果我将((),(),())作为返回值,编译器会得到一个"No instance for (Num a) from the the '1'“。
发布于 2012-02-08 23:58:44
您必须使用通用的guard实现else mzero生成一个空列表,即else []或,而不是return (),它是[()]。
成功分支生成一个三元组列表,即[(Int,Int,Int)] (或Integer,或另一个Num类型),因此失败分支必须生成相同的列表。由于失败意味着找不到三元组,因此它们将生成一个空列表。
请注意,在[] monad中,return x就是[x],而mzero (来自MonadPlus)与fail whatever相同,即[]。
发布于 2012-02-09 00:02:13
guard实际上不是语法糖。这是一个来自Control.Monad的函数。
guard :: MonadPlus m => Bool -> m ()
guard True = return ()
guard False = mzero在列表的情况下,mzero为[]。点击此处阅读更多信息:http://en.wikibooks.org/wiki/Haskell/MonadPlus
https://stackoverflow.com/questions/9196727
复制相似问题