当前位置:  开发笔记 > 前端 > 正文

为什么我不能在Haskell中的连接函数(++)上进行模式匹配?

如何解决《为什么我不能在Haskell中的连接函数(++)上进行模式匹配?》经验,为你挑选了2个好方法。

我正在尝试匹配**String Newline String**函数Split 中的模式.

split::String -> [String]
split[] = []
split (x++'\n':xs) = [x]++split(xs)

我收到这个错误: Parse error in pattern: x ++ ('\n' : xs)

我在这做错了什么?

我知道还有其他方法可以达到相同的结果,但我想了解这种模式有什么问题.我对Haskell BTW很新.



1> beigel..:

一个问题(据我所知)是++不是列表数据类型的构造函数:.您可以将列表数据类型视为定义为

data [a] = [] | a : [a]

:将元素追加到列表前面的构造函数在哪里.但是,++是一个函数(在此处的文档中定义:http://hackage.haskell.org/package/base-4.8.1.0/docs/src/GHC.Base.html#%2B%2B)as

(++) :: [a] -> [a] -> [a]
(++) []     ys = ys
(++) (x:xs) ys = x : xs ++ ys

我们可以定义我们自己的数据类型列表

data List a = Empty | Cons a (List a)

这将模仿我们熟悉的列表的行为.实际上,您可以(Cons val)在模式中使用.我相信你也可以使用concat构造函数定义一个类型

data CList a = Empty | Cons a (CList a) | Concat (CList a) (CList a)

您可以使用它来懒洋洋地连接两个列表并将它们连接成一个列表.使用这样的数据类型,您可以对Concat xs ys输入进行模式匹配,但是您只能在两个列表的边界上工作,而不能在一个列表的中间工作.

无论如何,我自己仍然是Haskell的新手,但我希望这是关键.


对于后代,模式匹配的形式语义在[Haskell报告](https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-580003.17)中定义.

2> Alexey Roman..:

想象一下,你可以.然后匹配"a\nb\nc"可以产生x = "a", xs = "b\nc"或者x = "a\nb", xs = "c"你需要一些临时规则来决定使用哪个.一般来说,与函数匹配也是不可能合理地实现的:你需要找到一个x给定的f x,除了尝试所有可能之外没有办法做到这一点x.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有