问题标签 [pattern-synonyms]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
6961 浏览

haskell - Haskell Bytestrings:如何进行模式匹配?

我是 Haskell 新手,在弄清楚如何模式匹配ByteString. 我的[Char]函数版本如下所示:

正如预期的那样,这会从字符串中过滤掉所有出现的“ab”。但是,我在尝试将其应用于ByteString.

天真的版本

产量

[]显然是罪魁祸首,因为它是常规String而不是ByteString. 插入BS.empty似乎是正确的,但在绑定位置给出了“限定名称:BS.empty”。让我们尝试

这给出了“模式中的解析错误” (x cons empty)。我真的不知道我还能在这里做什么。

作为旁注,我试图用这个函数做的是从一些文本中过滤掉一个特定的 UTF16 字符。如果有一种干净的方法可以实现这一点,我很想听听,但是这种模式匹配错误似乎是新手haskeller 应该真正理解的。

0 投票
3 回答
408 浏览

haskell - 定义 Haskell 类型构造函数相等?

我不是 Eq 的成员。我的代码:

在这种情况下,我定义例如(MU Terran Zerg)。我想创建一个数据构造函数TvZ,它在实例的所有方面都基本相同,因此我可以匹配一个函数模式:

而不是必须做

如果将其分配给变量,则无法执行此操作tvZ = (MU Terran Zerg)

我想做的另一件事是制作简短的表格,就像制作类型构造函数T一样Terran

最后一件事,我觉得医疗运输车的速度提升需要小幅削弱。

0 投票
2 回答
1708 浏览

haskell - Haskell 构造函数别名

有没有办法在 Haskell 中创建相当于创建“构造函数别名”的东西?我在想类似于类型别名,你可以给类型一个不同的名字,但它仍然在各个方面表现得像别名类型。

我的用例是一个系统,我有一个分配的时间作为我正在建模的某些对象的属性,所以UTCTime. 其中一些可能是“可变”时间,这意味着它可能尚未分配时间,或者它所拥有的时间是“可移动的”。所以Maybe UTCTime

但只有一些对象具有可变时间。其他人则有固定的时间,系统必须将其视为常数;当前分配给特定时间的时间变量的处理方式与固定时间不同。现在建议Either UTCTime (Maybe UTCTime); 它是固定时间或可能未分配的可变时间。

泛型类型似乎非常适合我想要建模的内容,因此使用它们感觉很自然。但是,虽然什么Either UTCTime (Maybe UTCTime) 显而易见的,但它的含义并不是特别明显,所以一些描述性的特殊情况名称会很好。

一个简单的type Timeslot = Either UTCTime (Maybe UTCTime)肯定会清理我的类型签名很多,但这对构造函数没有任何作用。我可以使用类似bound = Just获取名称来构造值,但不能用于模式匹配。

在另一端,我可以使用我想要的任何名称定义一个自定义 ADT,但是我失去了EitherandMaybe类型的所有预定义功能。或者更确切地说,我将一直来回应用转换(我认为这并不比使用newtype包装器的情况更糟,只是没有效率保证,但我怀疑这无论如何都会成为瓶颈)。而且我想理解使用泛型EitherMaybe函数来操作我的Timeslot值的代码我需要知道标准构造函数映射到我想要使用的任何东西的方式,并且转换函数将提供一个方便的编译器强制定义该映射. 所以也许这毕竟是一个好方法。

我很确定我非常了解 Haskell,可以说没有构造函数别名之类的东西,但我很好奇是否有一些我不知道的 hack,或者其他处理这种情况的好方法。

0 投票
2 回答
203 浏览

haskell - Haskell 类型同义词问题

这给了我以下错误

不在范围内:数据构造函数Blah

为什么?我以为我可以在任何我可以使用的地方使用类型同义词Person

0 投票
1 回答
684 浏览

haskell - 模式同义词导致不详尽的模式匹配

我设法构建了以下显示我的问题的“最小”示例。

如果启用了 PatternSynonyms 扩展

我收到函数 f 的警告说

如果我把每一个都换成Ve它就Vec不会抱怨了。我的奇异模式同义词如何干扰这里?

0 投票
2 回答
303 浏览

haskell - 如何在 Haskell 中处理大量常量?

我正在开发一个允许开发人员控制 Minitel(法国可视图文终端)的库。

我有很多不变的价值观,我想知道用 Haskell 管理它们的最佳方法。这是初学者中的常见问题,但我还没有找到令人满意的答案。

你可以看看我的项目 (注意:是的,只有一个模块中有太多常量,这就是我正在做的 ;-))

我目前有模块将它们保存为name = value. 虽然它有效,但我想知道它是否可以完善或者我是否做得对。

此方法有一个小缺点:您不能使用模式匹配,如果要保留名称,则需要使用守卫:

如果您不希望 GHC 因缺少签名或类型默认值而对您大喊大叫,您还必须使用 GHC 选项:

我曾经尝试过data deriving Enum使用技巧来补偿未定义的值,但是一旦值不从 0 开始,它就会变得丑陋。它也容易出错,如果您省略或添加一个值,以下名称的值将加上或减一:

此解决方案有一个缺点:您无法轻松混合列表中的值,因为它们属于不同类型:

我想到了另一个解决方案:

对于这个解决方案,我必须注意构造函数不要重叠。例如,NUL、SO 和 SI 在 ASCII 和 C0 中都存在(幸运的是,它们给出了相同的值 :-))。例如,我可以通过仅在 ASCII 中定义它们来处理这种情况。使用合格的导入会使事情变得更丑陋(ASCII ASCII.NUL)。

你有没有其他更好的方法来处理这个案子?

0 投票
1 回答
308 浏览

list - 一个“Nil”带有值的列表?

一些标准的 Haskell 库是否定义了这样的数据类型

那是一个列表,其终止元素带有指定类型的值?

与无限流同ListWithEnd ()[]并且同构。ListWithEnd Void或者,换个角度来看,ListWithEnd e a非常接近ConduitM () a Identity e..

0 投票
2 回答
1868 浏览

haskell - 模式匹配 Data.Sequence 类似列表

我正在使用Data.Sequence列表来获得更好的性能。使用列表,我们可以执行以下操作

怎么能做到这一点Data.Sequence。我尝试了以下方法:

我认为解决方案涉及使用S.viewland S.viewr,但似乎无法弄清楚如何。

0 投票
1 回答
228 浏览

haskell - 组合模式

考虑以下数据类型和模式同义词:

我想匹配 aFoo但得到所有a,bc. 像这样的东西(无效的 Haskell):

一种选择是使用ViewPattern

但这会导致非详尽的匹配警告。但我们知道这一点Bar并且Baz是无可辩驳的,所以匹配每个也是无可辩驳的。

在没有编译器警告的情况下如何表达?

这样做的动机是针对大型数据类型的字段使用细粒度的模式同义词,并允许调用者仅提取所需的字段,类似于使用NamedFieldPuns. 模式同义词还不支持记录语法,但它正在开发中:https ://ghc.haskell.org/trac/ghc/ticket/8582

在我的情况下,我无法从模块中公开构造函数,因为我使用的是“智能构造函数”模式,因此无法为调用者提供与NamedFieldPuns.

请参阅https://stackoverflow.com/a/25161749/3198498作为灵感。我正在尝试扩展该答案中的想法,以允许调用者任意提取m个字段中的n 个,以获得较大的m

PatternSynonyms编辑:事实证明,详尽性检查存在相当广泛的问题: https ://ghc.haskell.org/trac/ghc/ticket/10339 这似乎使用作字段提取器的模式同义词在编译启用警告时非常不愉快.

0 投票
1 回答
319 浏览

haskell - 为什么我不能与 Haskell 中的比率进行模式匹配?

我正在尝试根据比率进行模式匹配:

但是,这会产生:

有趣的是,Data.Ratio包以这种方式定义了numeratoranddenominator函数,但是使用了:%操作符:

但是,我无权访问后一个运算符。

谁能解释为什么我的模式匹配不起作用以及如何解决它?