首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell -从语法糖翻译

Haskell -从语法糖翻译
EN

Stack Overflow用户
提问于 2012-02-08 23:52:05
回答 2查看 340关注 0票数 1

翻译此代码的任务列表

代码语言:javascript
复制
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)

变成了一种无糖的苦味剂。

我想我已经解决了大部分问题,但我被困在中间,因为我需要解决一个问题,然后才能继续。到目前为止,我有:

代码语言:javascript
复制
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'“。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-08 23:58:44

您必须使用通用的guard实现else mzero生成一个空列表,即else []或,而不是return (),它是[()]

成功分支生成一个三元组列表,即[(Int,Int,Int)] (或Integer,或另一个Num类型),因此失败分支必须生成相同的列表。由于失败意味着找不到三元组,因此它们将生成一个空列表。

请注意,在[] monad中,return x就是[x],而mzero (来自MonadPlus)与fail whatever相同,即[]

票数 8
EN

Stack Overflow用户

发布于 2012-02-09 00:02:13

guard实际上不是语法糖。这是一个来自Control.Monad的函数。

代码语言:javascript
复制
guard :: MonadPlus m => Bool -> m ()
guard True  = return ()
guard False = mzero

在列表的情况下,mzero[]。点击此处阅读更多信息:http://en.wikibooks.org/wiki/Haskell/MonadPlus

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9196727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档