Haskell 局部函数的类型申明问题

发布于 2022-08-19 07:09:08 字数 803 浏览 14 评论 9

出自 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 加个类型申明, 正如注释的那样,该如何写?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

叹倦 2022-09-01 19:21:51

原帖由 flw 于 2009-11-6 13:06 发表

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

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

[ 本帖最后由 boilplate 于 2009-11-7 00:50 编辑 ]

猥︴琐丶欲为 2022-09-01 19:08:01

原帖由 retuor 于 2009-11-6 20:32 发表
是的。

看看这个连接是否合用?

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

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

风尘浪孓 2022-09-01 18:48:09

原帖由 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显示对的

风渺 2022-09-01 16:31:21

试一下字体

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 编辑 ]

↘人皮目录ツ 2022-09-01 06:40:35

是的。

看看这个连接是否合用?

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

天涯离梦残月幽梦 2022-08-31 13:06:28

原帖由 retuor 于 2009-11-6 11:31 发表
需要使用扩展

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

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

那一片橙海, 2022-08-31 12:32:33

原帖由 boilplate 于 2009-11-6 05:04 发表
在我的vi里看代码是对齐的,没用tab,我把tab键map成和上一行的最近非空白字符对齐,贴上来就不知怎么最后一行indent乱掉了

这是因为论坛恶心的设置,代码不是等宽字体造成的。
你用

  1. [font=新宋体][/font]

复制代码把你的代码括起来就好了。

你在我安 2022-08-29 10:42:50

需要使用扩展

{-# 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 = []

远山浅 2022-08-29 03:05:13

在我的vi里看代码是对齐的,没用tab,我把tab键map成和上一行的最近非空白字符对齐,贴上来就不知怎么最后一行indent乱掉了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文