Chinaunix

标题: Haskell初学者的疑问 [打印本页]

作者: sysabod    时间: 2009-04-06 21:47
标题: Haskell初学者的疑问
  1. u2 :: [String] -> String
  2. u2 xss = foldr join [] xss
  3.     where join xs ys = xs ++ “\n” ++ ys

复制代码

程序是想让列表中的每个字符串加\n隔开,winhugs下的出错信息是file:.\flodrdemo.hs:3 - Syntax error in expression (unexpected symbol "“\")
作者: win_hate    时间: 2009-04-06 21:52
引号用了中文字符? 下面这个就没有问题


  1. u2 :: [String] -> String
  2. u2 xss = foldr join [] xss
  3.     where join xs ys = xs ++ "\n" ++ ys
复制代码

作者: sysabod    时间: 2009-04-06 22:21
原帖由 win_hate 于 2009-4-6 21:52 发表
引号用了中文字符? 下面这个就没有问题


u2 :: [String] -> String
u2 xss = foldr join [] xss
    where join xs ys = xs ++ "\n" ++ ys

请与这个例子比较
reverse xs = foldr snoc [] xs
    where snoc y ys = ys++[y]

为什么要写成[y]而不是y呢?上一个例子也没加方括号啊?
作者: win_hate    时间: 2009-04-06 22:43
这两个函数做的事情是不同的,所以写法不一样。


  1. u2 :: [String] -> String
  2. u2 xss = foldr join [] xss
  3.     where join xs ys = xs ++ “\n” ++ ys
复制代码


在这里, ys 是积累的值,注意到 u2 的类型,最后产出是 String,所以 ys 的类型是 String

xs 则是从 u2 的第一个参数(它是个列表)中提取的元素,所以 xs 的类型也是 String

String 相当于字符列表,若干个 String 连起来,直接用 ++ 就可以了。


  1. reverse xs = foldr snoc [] xs
  2.     where snoc y ys = ys++[y]
复制代码


在第二段代码中, ys 也是积累的值,当 xs 是 String 时,其类型也是 String。

而 y 则是从 xs(它是个列表)中提取的元素。如果 xs 是个 String,也相当于 [Char],则 y 是个字符。

把字符附加到字符列表 ys 上,应该先把 字符提升成字符列表,再 ++.

[ 本帖最后由 win_hate 于 2009-4-6 22:48 编辑 ]
作者: flw    时间: 2009-04-06 23:38
你看你那引号两边还不一样,就知道不是半角的。
作者: izhier    时间: 2009-04-07 09:02
原帖由 sysabod 于 2009-4-6 21:47 发表
程序是想让列表中的每个字符串加\n隔开

试试这一个函数:
unlines ["abc", "123"]
作者: stealfire    时间: 2009-04-26 06:04
我对函数式编程非常有兴趣, ,觉得这个东东跟以前学过的语言都不一样。

可是我发现函数式语言也有好多种啊,不知道第一门选什么比较合适呢?

haskell?还是sicp中的scheme呢,或者是去年炒得挺厉害的erlang?请大家多指教啊。非常感谢。
作者: flw    时间: 2009-04-26 09:16
原帖由 stealfire 于 2009-4-26 06:04 发表
我对函数式编程非常有兴趣, ,觉得这个东东跟以前学过的语言都不一样。

可是我发现函数式语言也有好多种啊,不知道第一门选什么比较合适呢?

haskell?还是sicp中的scheme呢,或者是去年炒得挺厉害 ...

都学。
作者: MMMIX    时间: 2009-04-26 09:52
原帖由 stealfire 于 2009-4-26 06:04 发表
我对函数式编程非常有兴趣, ,觉得这个东东跟以前学过的语言都不一样。

可是我发现函数式语言也有好多种啊,不知道第一门选什么比较合适呢?

随便了。你要是实在决定不了,就抛色子。
作者: izhier    时间: 2009-04-26 10:47
标题: 回复 #7 stealfire 的帖子
也可以到网上搜一下这几个语言的特点及应用
或者看一下本版的一些老帖子

看哪个比较适合自己的胃口就选择那个?

BTW
我就是看老帖子中版主们对这几个语言的评价,又在网上搜了一下,决定学习Haskell的
作者: stealfire    时间: 2009-04-26 23:51
谢谢诸位, ,我先检索一下,然后选一门开始学吧,以后请多指教。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2