【发布时间】:2012-02-08 15:52:04
【问题描述】:
翻译这个的任务是
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 literal '1'”
【问题讨论】:
-
顺便说一下,
[1 .. 200]可以被认为是enumFromTo 1 200的“语法糖”。 -
有不止一种可能的翻译。例如,可以将其重写为列表推导式,并通过一种避免连接的方案进行翻译。