haskell - 为什么我不能在 Haskell 中的串联函数 (++) 上进行模式匹配?

标签 haskell pattern-matching

我正在尝试匹配 **String Newline String**函数拆分中的模式。

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

我收到此错误:Parse error in pattern: x ++ ('\n' : xs)
我在这里做错了什么?

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

最佳答案

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

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

在哪里 :是一个将元素附加到列表前面的构造函数。但是,++是一个函数(在此处的文档中定义:http://hackage.haskell.org/package/base-4.8.1.0/docs/src/GHC.Base.html#%2B%2B)为
(++) :: [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 - 为什么我不能在 Haskell 中的串联函数 (++) 上进行模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34217515/

相关文章:

haskell - 库用户还需要编译库所需的静态 .lib 吗?

types - 为什么要在 Haskell 中编写类型声明?

haskell - 新类型阅读器单子(monad)的强制转换为其值类型提供了强制转换

Haskell:为什么这个函数不断要求用户输入而不终止

javascript - 如何使用 Google 脚本在另一个数组中搜索一组模式?

haskell - Haskell 列表的点积

constructor - 模式匹配中的部分解构 (F#)

haskell - 实例实现的模式匹配

pattern-matching - 如何在OCaml中执行“小睡但归还单位”

regex - 查找 CVE 匹配项的正则表达式