我正在阅读这篇有趣的博客文章Parse,请不要验证,它包括以下内容:
为此,我们需要一个表示非空列表的类型。幸运的是,Data.List.NonEmpty中现有的NonEmpty类型就是这样。它具有以下定义:
data NonEmpty a = a :| [a]
Run Code Online (Sandbox Code Playgroud)
注意,NonEmpty a实际上只是a和一个普通的可能为空[a]的元组。通过将列表的第一个元素与列表的尾部分开存储,可以方便地对非空列表进行建模:即使[a]组件为[],也必须始终存在a组件。
我唯一能找到的地方:|是对此SO问题的评论,这意味着我需要对该问题/讨论有一定的了解,并分析格式。
是否有任何相关文档(我的搜索没有取得成果),并且对它的用法有简单的解释吗?我不明白,因为有时我只会和Haskell一起把脚趾浸入水中。
任何帮助或见解将不胜感激。
类型的全名是Data.List.NonEmpty。
您可以在这里找到详细信息
有一个站点https://hoogle.haskell.org/,它是在haskell库中搜索函数,类型等的良好起点。
编辑:如果您与:|意思混淆,那么这里有一些解释。
在Haskell,你可以自定义运营商喜欢.,$,<*>。使用自定义“名称”创建infix构造函数的方式相同。
因此,您可以自己定义:
data MyType = Integer :++ Integer
Run Code Online (Sandbox Code Playgroud)
并将它们用作
someVal :: MyType
someVal = 1 :++ 2
Run Code Online (Sandbox Code Playgroud)
要么
foo :: MyType -> Integer
foo (a :++ b) = a
Run Code Online (Sandbox Code Playgroud)
请注意,它必须以:(感谢@Ben)开头
该data声明定义 :|,而不是使用预定义的:|运算符。
考虑一下[]在(伪)Haskell 中如何定义的常用示例:
data [] a = [] | (:) a ([] a) -- data [a] = [] | a : [a]
Run Code Online (Sandbox Code Playgroud)
在这里,:被定义为创建给定类型的元素a和另一个类型的列表的列表的运算符[a]。
就像可以定义中缀运算符一样,任何类型都可以创建中缀构造函数。infix构造函数和infix运算符之间的区别在于,构造函数可以并且必须以开头:。((:)本身是一个琐碎的示例,以a 开头,仅由a 组成:。)
您还可以定义类型级别的infix构造函数。例如,
type f :+: g = Either f g
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |