免费注册 查看新帖 |

Chinaunix

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

Haskell 局部函数的类型申明问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-06 04:59 |只看该作者 |倒序浏览
出自 RealWorldHaskell 一练习题: Chapter 4, 97页, 第7题

原题是用 foldr 写 takeWhile。  假如我这样写(初写haskell, 代码不如C写来漂亮,请匆追究)


  1. takeWhile_fold :: (a -> Bool) -> [a] -> [a]
  2. takeWhile_fold fun xs = foldr step [] xs
  3.                where
  4.                  --step :: a -> [a] -> [a]  -- ????
  5.                  step x xs | fun x = x:xs
  6.                            | otherwise = []
复制代码


若要给 step 加个类型申明, 正如注释的那样,该如何写?

论坛徽章:
0
2 [报告]
发表于 2009-11-06 05:04 |只看该作者
在我的vi里看代码是对齐的,没用tab,我把tab键map成和上一行的最近非空白字符对齐,贴上来就不知怎么最后一行indent乱掉了

论坛徽章:
0
3 [报告]
发表于 2009-11-06 11:31 |只看该作者
需要使用扩展

{-# OPTIONS -XPatternSignatures #-}
{-# OPTIONS -fglasgow-exts #-}

takeWhile_fold :: (a -> Bool) -> [a] -> [a]
takeWhile_fold (fun::a->Bool) xs= foldr step [] xs
               where step::a->[a]->[a]
                     step x xs | fun x = x:xs
                                   | otherwise = []

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2009-11-06 13:06 |只看该作者
原帖由 boilplate 于 2009-11-6 05:04 发表
在我的vi里看代码是对齐的,没用tab,我把tab键map成和上一行的最近非空白字符对齐,贴上来就不知怎么最后一行indent乱掉了

这是因为论坛恶心的设置,代码不是等宽字体造成的。
你用
  1. [font=新宋体][/font]
复制代码
把你的代码括起来就好了。

论坛徽章:
0
5 [报告]
发表于 2009-11-06 19:49 |只看该作者
原帖由 retuor 于 2009-11-6 11:31 发表
需要使用扩展







我看的每个教材上都说“最好把类型申明写上”,我做练习的时候也喜欢这样, 便于熟悉这些陌生的语言。

这是编译器的 pragma 吗?  能否详细解释一下或给个链接

论坛徽章:
0
6 [报告]
发表于 2009-11-06 20:32 |只看该作者
是的。

看看这个连接是否合用?

http://www.haskell.org/ghc/docs/ ... _guide/pragmas.html

论坛徽章:
0
7 [报告]
发表于 2009-11-06 21:02 |只看该作者
试一下字体

Courier



  1. takeWhile_fold :: (a -> Bool) -> [a] -> [a]
  2. takeWhile_fold fun xs = foldr step [] xs
  3.                where
  4.                  --step :: a -> [a] -> [a]  -- ????
  5.                  step x xs | fun x = x:xs
  6.                            | otherwise = []
复制代码



新宋


  1. takeWhile_fold :: (a -> Bool) -> [a] -> [a]
  2. takeWhile_fold fun xs = foldr step [] xs
  3.                where
  4.                  --step :: a -> [a] -> [a]  -- ????
  5.                  step x xs | fun x = x:xs
  6.                            | otherwise = []
复制代码



monospace



  1. takeWhile_fold :: (a -> Bool) -> [a] -> [a]
  2. takeWhile_fold fun xs = foldr step [] xs
  3.                where
  4.                  --step :: a -> [a] -> [a]  -- ????
  5.                  step x xs | fun x = x:xs
  6.                            | otherwise = []
复制代码



[ 本帖最后由 retuor 于 2009-11-6 21:08 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-11-07 00:37 |只看该作者
原帖由 retuor 于 2009-11-6 21:02 发表
试一下字体

Courier



takeWhile_fold :: (a -> Bool) -> [a] -> [a]
takeWhile_fold fun xs = foldr step [] xs
               where
                 --step :: a -> [a] -> [a]  -- ????
     ...




呵呵,我这里新宋体也不行 只有monospace显示对的

论坛徽章:
0
9 [报告]
发表于 2009-11-07 00:40 |只看该作者
原帖由 retuor 于 2009-11-6 20:32 发表
是的。

看看这个连接是否合用?

http://www.haskell.org/ghc/docs/ ... _guide/pragmas.html




不喜欢在程序里加pragma , 以后还是不写类型申明了

论坛徽章:
0
10 [报告]
发表于 2009-11-07 00:49 |只看该作者
原帖由 flw 于 2009-11-6 13:06 发表

这是因为论坛恶心的设置,代码不是等宽字体造成的。
你用  把你的代码括起来就好了。



平时不太上论坛,原来认为,众多论坛上 \[code\] 的作用就是把代码用合适的字体,语法加色的显示出来.

[ 本帖最后由 boilplate 于 2009-11-7 00:50 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP