Haskell 数据类型列表

2024-03-26

这可能是另一个简单的 Haskell 问题。如果我有一些“嵌套”数据类型,例如在此示例代码中:

data Place = Country
           | State
           | City String
           deriving Show

data State = California
           | NewYork
           deriving Show

data Country = USA
             | Canada
             deriving Show

我可以合法地制作一个列表,例如 [国家] 类型的 [美国、加拿大],或 [州] 类型的 [加利福尼亚、纽约],或 [地点] 类型的 [城市“a”、城市“b”]。

我需要做什么才能列出[美国,纽约]之类的列表?纽约是一个州,它是一个地方,而美国是一个国家,它是一个地方,但 ghci 看到的是美国,所以它假设我正在制作一个国家列表(纽约是一个州,所以该列表失败)。

我认为我需要某种方法将一个国家或州投射到一个地方,但我不知道如何实现这一点。

我试图避免将 State 和 Country 中包含的数据放入 Place 类型中,我知道这会使其工作,但我有大量的真实数据,我不想像这样混乱。


这里还有一些输出让我找出了问题所在:

*Main> [State, State]
[State,State]
*Main> :t State
State :: Place
*Main> :t NewYork
NewYork :: State

这似乎暗示单词“State”是 Place 的有效构造函数,并且数据 State 仅指 California 或 NewYork 的值。

如果你稍微改变一下程序,就可以:

data Place = Country Country
           | State State
           | City String
           deriving Show

data State = California
           | NewYork
           deriving Show

data Country = USA
             | Canada
             deriving Show

那么您可以创建一个列表,例如[美国国家/地区,纽约州],其类型正确为[地点]。在第一个示例中使用相同的单词两次并不会像我想象的那样将 State 类型“绑定”在一起。

当然,使用构造函数 State State 只是一个偏好问题,我可以轻松地做到AmericanState State如果我愿意的话,可以在 Place 类型中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell 数据类型列表 的相关文章

  • 如何使用免费 Monad 的 Church 编码?

    我一直在使用Free数据类型在Control Monad Free来自free包裹 现在我正在尝试将其转换为使用F in Control Monad Free Church但不知道如何映射功能 例如 一个简单的模式匹配函数使用Free看起来
  • 将元组列表转换为列表列表 Haskell

    I have m n p q r s 我怎样才能将它转换为 m n p q r s 谁能帮帮我吗 谢谢 编写一个函数将一对转换为列表 pairToList a a gt a pairToList x y x y 那么你只需要map pair
  • Haskell:为什么将辅助函数命名为“go”?

    I see go在阅读 Haskell 材料或源代码时 我经常会遇到这样的情况 但我从来没有真正感到舒服 我猜它在我的脑海中具有 goto 的负面含义 我开始用 LYAH 学习 Haskell 这就是我开始使用 Haskell 的原因acc
  • Haskell:使用 RankNTypes 折叠记录构造函数

    import Data ConfigFile data Test Test field1 Int field2 Bool field3 String deriving Show whatMyConfigLooksLike field1 5
  • Haskell:单词,取消单词分隔符

    有什么办法可以提供分隔符words and unwords在haskell中 使其类似于python中的split和join 另请查看友好的包裹split 它提供了一个模块Data List Split http hackage haske
  • runghc 和 runhaskell 之间有什么区别?

    RWH 突然开始使用 runhaskell 而不是 runghc 有什么不同 据我所知 它们的工作原理是一样的 runhaskell可以运行您系统上使用的任何 Haskell 解释器 它不一定是 GHCi 例如 runhaskell可以改为
  • 将单词的第一个字母大写,同时删除空格(Haskell)

    我刚刚开始使用 Haskell 这就像我正在写的第三件事 所以 自然地 我发现自己有点困惑 我正在尝试编写一些代码 该代码将获取一个字符串 删除空格 并将该字符串的每个字母大写 例如 如果我输入 这是一个测试 我想返回类似 thisIsAT
  • 陷入状态 Monad

    我想使用节点和唯一键的 IntMap 创建一个图形结构 这个话题已经被很好地涵盖了here https stackoverflow com questions 12941625 ids from state monad in haskell
  • 在 Haskell 中的列表末尾添加一个元素

    我是 Haskell 的初学者 我正在尝试在列表末尾添加一个元素 我输入一个像 1 2 3 4 这样的列表和一个数字 10 我想要一个像这样的输出 1 2 3 4 10 My code func a a func a x xs x func
  • Show 的新实例声明

    我正在尝试在 Haskell 中为我创建但未成功创建的新数据类型添加实例声明 到目前为止我已经尝试过 data Prediction Prediction Int Int Int showPrediction Prediction gt S
  • C# 中的 String 和 string 有什么区别?

    这两者之间有什么区别 我应该使用哪一个 string s Hello world String s Hello world string https learn microsoft com en us dotnet csharp langu
  • Haskell 将两个列表中不同索引处的元素组合起来

    对这个糟糕的标题表示歉意 我不太确定如何用语言描述它 但这就是我的意思 如果您知道更好的表达方式 请告诉我 假设我有 2 个长度相等的列表 a b c x y z 我想创建列表 a y z b x z c x y 本质上 对于 list1
  • 类型模块中的什么类型描述了一个类?什么类型描述了一个函数?

    The new typingPython 3 5 中的 module 提供了许多用于类型注释的工具 它是否提供了封装以下思想的对象或类型class 怎么样的想法function 在下面定义装饰器的代码中 应该代表什么class 应该代表什么
  • 什么是 lub(null, Double)?

    表15 25 B http docs oracle com javase specs jls se8 html jls 15 html jls 15 25在 JLS 版本 8 中表示条件表达式的类型 true null 0 0 is lub
  • 通过列表搜索

    我一直在尝试定义一个函数 给定一个整数列表和一个整数 n 返回一个布尔值 指示 n 是否在列表中恰好出现一次 我有这个 但它不起作用 我无法弄清楚 once a gt a gt Bool gt Bool filter filter p x
  • 应该如何理解“引理”函数的一般类型?

    也许这是一个愚蠢的问题 这是引用自the 哈索主义 paper https personal cis strath ac uk conor mcbride pub hasochism pdf 解决这个问题的一种方法是对引理进行编码 由下式给
  • 如何重构“字符串类型”代码?

    我目前正在开发一个代码库 其中有几类变量 例如数据库路径 它们简单地表示为字符串 这些 非 类型的大多数操作都在实用程序类中定义 我创建了一个新类来表示数据库 并将操作定义为实例方法 采用传统的 OOP 风格 然而 浏览大型代码库并重构它以
  • 具有特定深度的 TypeScript 递归类型

    TypeScript 允许您编写递归类型 但无法深入了解代码在较低级别 即深度 中如何变化 例如 下面的代码在所有级别上都具有相同类型的签名 并且我们必须在每个级别手动检查是否存在sub财产 type Recurse foo string
  • 为什么实现接口的类与 Java 中的接口不属于同一类型?

    I have out load output transactions columnHeaders dataFormat Where load定义为 public boolean load String outputfile List
  • 如何将 interface{} 转换回其原始结构?

    我需要一种方法将结构 接口动态转换回其原始对象 我可以在里面添加方法 函数 基本上我需要这样的东西 MyStruct gt Interface gt MyStruct 在最终转换时 除了结构内部的内容之外 我对原始结构一无所知 所以我不能这

随机推荐