首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2:12:分析输入‘`count’时出错

2:12:分析输入‘`count’时出错
EN

Stack Overflow用户
提问于 2013-10-20 13:21:49
回答 1查看 189关注 0票数 0

问题是:现代数学的著名证明之一是乔治·坎托证明有理数集是可枚举的。该证明通过使用有理数的显式枚举来工作,如下图所示。

代码语言:javascript
复制
1/1 1/2 1/3 1/4 1/5 ...
2/1 2/2 2/3 2/4
3/1 3/2 3/3
4/1 4/2
5/1

在上图中,第一项是1/1,第二项是1/2,第三项是2/1,第四项是3/1,第五项是2/2,依此类推。

您要编写一个程序,该程序将读取从1到107范围内的数字列表,并为每个数字打印Cantor枚举中的相应项,如下所示。最后一个数字后不应出现空行。输入列表每行只包含一个数字,并将在文件结束时终止。输入文件中出现的数字不会超过30个。

我写的代码是:

代码语言:javascript
复制
stepOver = do [left num den dir]
   count <- getLine
   let left =  count' -1
   if left == 0
    then putStrLn [num den]
    let newleft = left -1
        case (stepOver num) of
            1 -> if dir == up
                stepOver = [newleft 1 (den + 1) down]
                stepOver = [newleft 2 (den - 1) down]
        case (stepOver den) of
            1 -> if dir == down
                stepOver = [newleft (num + 1) 1 down]
                stepOver = [newleft (num - 1) 2 down]
        case (stepOver dir) of
            up -> stepOver = [newleft (num - 1) (den + 1) dir]
        case (stepOver dir) of
            down -> stepOver = [newleft (num + 1) (den - 1) dir]

那么,你能告诉我为什么我错了吗?

EN

回答 1

Stack Overflow用户

发布于 2013-10-20 13:31:17

我想你需要读一些关于Haskell的东西。你误解了一些基本的语法。

首先,case是这样工作的。

代码语言:javascript
复制
case expression of
  pat1 -> expr1
  pat2 -> expr2
  ...

case someBool of
   True -> 1
   False -> 2

接下来是if

代码语言:javascript
复制
if someBool then expr1 else expr2

else,而不是 optional。

代码语言:javascript
复制
if True then 1 else 2

接下来,let

代码语言:javascript
复制
let pat1 = expr1
    pat2 = expr2
    ...
in expr

let foo = 1
    bar = 2
in foo + bar

最后,do

代码语言:javascript
复制
do
  someExpr
  let pat = expr
  pat <- someExpr
do
  putStrLn "Hello World"
  let x = 1
  myLine <- getLine

现在,一旦你弄清楚了一些语法,你应该能够修复你的代码。

编辑:

Haskell中的变量是不可变的,在do块中编写foo = bar不会改变它。这只是一个语法错误,你的代码中有几个错误。

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

https://stackoverflow.com/questions/19474207

复制
相关文章

相似问题

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