几天后,我试图围绕Haskell中的函数式编程范例.我通过阅读教程和观看截屏视频来完成这项工作,但似乎没有什么能够坚持下去.现在,在学习各种命令式/ OO语言(如C,Java,PHP)时,练习对我来说是个好方法.但由于我不知道Haskell能够做什么,并且因为有许多新概念可供使用,我还不知道从哪里开始.
那么,你是如何学习Haskell的?是什么让你真正"打破僵局"?还有开始练习的好主意吗?
一段时间以来,我一直在寻找一个体面的Haskell指南,但是找不到一个看起来很有趣的内容和/或有意义的指南.
几年前我曾经接触过Haskell,但我记不起来了.我记得"啊哈!" - 当我终于得到它时感觉不可思议,玩起来真的很有趣,所以我想重新发现丢失的Haskell艺术.
我熟悉Ruby及其函数式编程技巧,所以我觉得我并非完全处于黑暗中.有链接吗?
我很难理解这个Haskell函数.我知道它表面上做了什么,但我不确定它是如何实现这一功能的.
zip (x:xs) (y:ys) = (x,y) : zip xs ys
zip xs ys = [ ]
Run Code Online (Sandbox Code Playgroud)
我的想法:
zip 是函数的名称. zip需要2个参数.(我相信currying在这里并不重要).(x:xs)和(y:ys)zip返回元组类型的列表(x,y).现在我不太了解参数
(x:xs) (y:ys)
Run Code Online (Sandbox Code Playgroud)
冒号将一些内容添加到列表的开头(返回列表),那么我们为什么要将某些内容添加到我们想要压缩的列表中呢?什么是x和y功能定义?
右侧看起来很明显:我们将元组(x,y)插入(0)到zip返回的元组列表中.
(x,y) : zip xs ys
Run Code Online (Sandbox Code Playgroud)
现在,zip xs ys = [ ]如果我们只传递2个列表,为什么我们总是想要一个空列表呢?
你能解释下面的调用是如何zip进行评估的:
zip [5,7,9] [1,3,5,11]
Run Code Online (Sandbox Code Playgroud) 只是在这里与Haskell挣扎......我的术语非常糟糕,鉴于我的母语不是英语,进行正确的搜索有点复杂:P我正在关注一些haskell教程/书籍(了解你一个Haskell,Real World Haskell,Happy Learn Haskell,也是一个邮件列表,以及一些随机页面),现在我已经停在这里:
head' :: [Char] -> Char
head' (x:_) = x
Run Code Online (Sandbox Code Playgroud)
此函数接收String类型的元素列表,如果我像这样应用它:
head' "hello"
Run Code Online (Sandbox Code Playgroud)
它返回"h",它与x有界,"ello"与_有界,但无关紧要,因为我不使用它.我明白(:)函数(或用作中缀运算符)接收一个元素,它将被放入并且新列表的开始,其尾部将是另一个接收元素:
'a' : ['b', 'c']将返回"abc"但是,为什么当我在括号内使用":",第一个元素是x,其余的是_?这里发生了什么?
我读了几个像这样的问题(x:xs)模式Haskell逻辑和这个(我更接近回答我的问题)(x:_)和[x:_]是什么意思?但是最后一个接受的问题是:":是列表的构造函数,它将新列表的头部作为左边的参数,尾部作为右边的参数.如果你将它用作这里的模式,那意味着你匹配的列表的头部是正确的模式,左边是尾部. "
"列表的头部是右边的,尾部是左边的"......它真的让我感到困惑:如果头部被赋予"_"而尾部被赋予"x",当模式使用":"时匹配,为什么x具有列表头的值?
我想也许是我糟糕的英语水平让我很难掌握这个哈哈.我也会欣赏一些提示(如特定搜索)而不是直接回答:)
谢谢 :)
编辑:对于像我这样的另一个菜鸟....正如接受的答案所说,"abcd"只是'a':'b':'c':'d',模式(x:_)匹配'a' :'b'等等,下划线表示"我不关心其余部分",并接收其余的字符.只是 :)