gpt4 book ai didi

pattern-matching - (纯脚本)如何对 "empty type"的代数数据类型进行模式匹配

转载 作者:行者123 更新时间:2023-12-04 08:32:03 25 4
gpt4 key购买 nike

我正在 PureScript 中使用以下代数数据类型...

data Extended a = Infinite | Finite a

v1 = Finite 11
v2 = Infinite

我无法弄清楚如何模式匹配“无限”的情况,因为它似乎 v2有类型 forall t140. Extended t140 .我假设 t140 是编译器自动填充的某种占位符。v1 的类型是 Extended Int .因此,如果我设置一个 Eq 实例来比较 Extended 的值,则 Infinite 大小写不匹配...
instance extendedEq :: (Eq a) => Eq (Extended a) where
eq (Finite a) (Finite b) = eq a b
eq Infinite Infinite = true
eq Infinite _ = false
eq _ Infinite = false

所以当我尝试运行 v2 == v2我得到错误...
No type class instance was found for Prelude.Eq (Extended _0)

这是有道理的,因为我想它正在尝试为 t140 找到一个 Eq 实例。

所以我的问题是,如何在 Infinite 类型上进行模式匹配?

最佳答案

问题不在于模式匹配或您的实例实现。您的 ADT 与 Maybe 具有相同的结构。 ,如果我尝试

main = print (Nothing == Nothing)

我得到错误代码: https://github.com/purescript/purescript/wiki/Error-Code-NoInstanceFound

您的类型参数 t140 可以是 Eq 中的任何内容类型类,因此编译器无法选择实例。您需要为 == 的至少一个操作数添加类型注释。 :
v2 = Infinite :: Extended Int

但我承认,如果编译器能够弄清楚 Infinite == Infinite 会更令人满意。对于任何(相同的)类型参数...

关于pattern-matching - (纯脚本)如何对 "empty type"的代数数据类型进行模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36684549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com