免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4717 | 回复: 6
打印 上一主题 下一主题

haskell - 崩溃的缩进 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-19 13:08 |只看该作者 |倒序浏览
在real world haskell 里面看到一个例子. 就比葫芦画瓢的写了一遍.
结果从编译失败. 每个字母都检查了一下, 一模一样. 最后复制 例子 , 编译通过.
最后发现是缩进的问题.  代码如下:
正确的代码如下:
import System.IO
import Data.Char(toUpper)

main :: IO ()
main = do
       inh <- openFile "input.txt" ReadMode
       outh <- openFile "output.txt" WriteMode
       mainloop inh outh
       hClose inh
       hClose outh
   
mainloop :: Handle -> Handle -> IO ()
mainloop inh outh =
    do ineof <- hIsEOF inh
       if ineof
           then return ()
           else do inpStr <- hGetLine inh
                        hPutStrLn outh (map toUpper inpStr)
                        mainloop inh outh

不正确的代码如下:

import System.IO
import Data.Char(toUpper)

main :: IO ()
main = do
       inh <- openFile "input.txt" ReadMode
       outh <- openFile "output.txt" WriteMode
       mainloop inh outh
       hClose inh
       hClose outh
   
mainloop :: Handle -> Handle -> IO ()
mainloop inh outh =
    do ineof <- hIsEOF inh
       if ineof
           then return ()
           else do inpStr <- hGetLine inh
                   hPutStrLn outh (map toUpper inpStr)
                   mainloop inh outh
编译的时候提示:

[1 of 1] Compiling Main             ( interactwith.hs, interactwith.o )

interactwith.hs:17:19:
    The last statement in a 'do' construct must be an expression

谁能解释一下, haskell 的缩进是怎么回事? 应该怎么处理. 本来一个小程序, 结果折腾了一个上午. 非常感谢.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-01-19 14:00 |只看该作者

回复 #1 luckyelement 的帖子

Haskell 通过缩进(称为 layout) 确定代码的结构,layout 的作用和 C 的 {} 以及 ; 类似。在网上搜索点介绍资料看看。

btw,如果以前没有接触过 Haskell,不宜一开始就看 RWH,可以先看点入门资料,例如 Yet Another Haskell Tutorial 就不错。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2009-01-20 17:44 |只看该作者
Haskell 的 layout 在 YAHT 里面讲的也挺少的。
不过 Haskell 也支持 {} 和分号,因此可以和缩进混合使用。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2009-01-20 18:01 |只看该作者
原帖由 flw 于 2009-1-20 17:44 发表
Haskell 的 layout 在 YAHT 里面讲的也挺少的。

入门足够了。
不过 Haskell 也支持 {} 和分号,因此可以和缩进混合使用。

{}, ; 只应该用在比较特殊的地方,例如很短的几个语句啥的。

论坛徽章:
0
5 [报告]
发表于 2009-01-22 11:57 |只看该作者
谢谢, 还是之前看书的时候不仔细造成的, 又看了一下规范,虽然只有几句话, 已经够用. 现在搞定了.
这种缩进方式, 可以让程序看起来, 更清晰 和 更严禁.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2009-01-22 12:56 |只看该作者
原帖由 luckyelement 于 2009-1-22 11:57 发表
谢谢, 还是之前看书的时候不仔细造成的, 又看了一下规范,虽然只有几句话, 已经够用. 现在搞定了.
这种缩进方式, 可以让程序看起来, 更清晰 和 更严禁.

你这帖子回的就不严谨。。。

[ 本帖最后由 MMMIX 于 2009-1-22 12:59 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-01-23 22:37 |只看该作者
你把do都拿出来单独一行,就会发现缩进很简单。
do是个语法糖,不单独写一行很多时候会导致缩进错误,并且会使代码参差不齐。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP