Haskell 中的有限自动机

2024-04-12

在 Haskell 中表示有限自动机的好方法是什么?它的数据类型是什么样的?

在我们学院,自动机被定义为 5 元组

(Q, X, delta, q_0, F)

其中 Q 是自动机状态的集合,X 是字母表(这部分是否必要),delta 是从 (Q,X) 获取 2 元组并返回状态/-s 的转换函数(在非确定性版本中), F 是接受/结束状态的集合。

最重要的是,我不知道什么类型delta应该有...


有两个基本选项:

  • 显式函数delta :: Q -> X -> Q (or [Q]正如斯文·海格所建议的那样。
  • A map delta :: Map (Q, X) Q例如使用Data.Map,或者如果您的州/字母表可以按升序数字索引Data.Array or Data.Vector.

请注意,这两种方法本质上是等效的,可以从映射版本转换为函数版本(由于额外的原因,这略有不同)Maybe来自lookup调用)相对容易

delta_func q x = Data.Map.lookup (q,x) delta_map

(或者针对您使用的任何映射类型的查找函数的适当柯里化版本。)


如果您在编译时构造自动机(因此知道可能的状态并可以将它们编码为数据类型),那么使用函数版本可以为您提供更好的类型安全性,因为编译器可以验证您是否已涵盖所有情况。

如果您在运行时构建自动机(例如,根据用户输入),则存储delta作为映射(并且可能执行上面的函数转换)并具有适当的输入验证来保证正确性,以便fromJust是安全的(即地图中总是有一个条目用于任何可能的(Q,X)元组,因此查找永远不会失败(永远不会返回Nothing)).

非确定性自动机与映射选项配合得很好,因为查找失败与没有状态可去相同,即空的[Q]列表,所以不需要any的特殊处理Maybe除了打电话给join . maybeToList (join来自Data.Monad and maybeToList来自Data.Maybe).


另一方面,字母表绝对是必要的:它是自动机接收输入的方式。

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

Haskell 中的有限自动机 的相关文章

  • 机器和管道(或其他类似的库)之间的概念区别是什么?

    我想学习这个概念 以便我能够理解和使用诸如machines http hackage haskell org package machines 我试着跟随R nar Bjarnason 关于机器的演讲 https dl dropbox co
  • 由于标志字节串 -lt-0_10_4,无法使用 Stack 构建 hello world 程序

    通过生成一个裸露的 hello world 项目 stack new myproject simple 每当我跑步时stack setup stack init or stack build我总是出现以下错误 Downloading lts
  • 在 Haskell 中提升 State monad 中的值

    我正在 Haskell 中编写一个数独生成器 求解器作为学习练习 My solve函数接受一个UArray但返回一个State Int UArray 这样它也可以返回解决问题时发现的最大难度级别 到目前为止 这是我的功能 仍处于实验性的早期
  • 在 Haskell 中阅读 GraphML

    我正在尝试将包含单个有向图的 GraphML 文件读入 HaskellData Graph http hackage haskell org package containers 0 2 0 1 docs Data Graph html为了
  • 如何在 Haskell 中获得列表的中间位置?

    我刚刚开始使用 Haskel 学习函数式编程 我正在慢慢度过Erik Meijer 在 Channel 9 的讲座 http channel9 msdn com shows Going Deep Lecture Series Erik Me
  • 在 Haskell 中将字节转换为 Int64s/Floats/Doubles

    我正在尝试解析 Haskell 中的二进制文件格式 Apple 的二进制属性列表格式 该格式所需的内容之一是将字节序列视为 a 无符号 1 2 或 4 字节整数 b 有符号 8 字节整数 c 32 位floats d 64 位doubles
  • 如何使用 Haskell 中的 thyme 库从 Int 值创建 UTCTime?

    我有年 月 日 小时和分钟值 所有这些都是类型Int 我怎样才能将它们转换为UTCTime or UniversalTime 需要导入以下内容 import Control Lens import Data Thyme Clock impo
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • Haskell Cabal 包 - 找不到 Paths_ 模块

    我正在开发一个 Haskell 项目 Happstack 服务器 Blaze HTML 前端作为主要库 我想添加一个静态数据目录 看起来你可以使用 Cabal 使用自动生成的Path
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 使用pluginaweek的state_machine,我可以在事件期间引用activerecord对象吗?

    我正在尝试实现一个 挂起 事件 将对象转换为 挂起状态 但我需要能够 取消暂停 并返回到之前的状态 我向模型添加了 previous state 字段 但我看不到如何在事件块内访问它 这是我试图实现的基本逻辑 event suspend d
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析
  • 在 Yesod 生态系统中,对某些文本进行 urlencode 的最佳方式是什么?

    我想对一些文本进行 url 编码 例如 用 20 替换每个空格等 我找到了 HTTP Network HTTP Base urlEncode 并且可以使用它 但我想知道是否还有其他通常在 Yesod 生态系统中使用的东西 不幸的是 由于 U
  • 如何在 Haskell 中漂亮地打印表格?

    我想在 Haskell 中漂亮地打印一个类似表格的数据结构 列列表 例如 Table StrCol strings a bc c IntCol ints 1 30 2 DblCol doubles 2 0 4 5 3 2 应该渲染类似 st
  • 瞬态 REST 表示

    假设我有一个 RESTful 超文本驱动的服务 用于模拟冰淇淋店 为了帮助更好地管理我的商店 我希望能够显示每日报告 列出所售每种冰淇淋的数量和美元价值 看来这种报告功能可以作为名为 DailyReport 的资源公开 DailyRepor
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • 简单 Haskell Monad - 随机数

    我正在尝试扩展代码这个帖子 https stackoverflow com questions 3944170 haskell and state 接受的答案 允许我能够基于以种子作为参数的函数 randomGen 调用 randomGen

随机推荐

  • .net core PGP加密解密

    上遇到错误void Encryption public void Encryption region PGP Encryption PgpEncryptionKeys encryptionKeys new PgpEncryptionKeys
  • 如何以人类可读的方式打开 Java .class 文件?

    我试图弄清楚 Java applet 类文件在幕后的作用 用记事本或文本板打开它只会显示一堆官样文章 有什么方法可以将其恢复为可读的格式 以便我可以尝试弄清楚它在做什么 环境 安装了 VS 2008 的 Windows jd gui htt
  • FFMPEG - 以特定时间间隔在视频上叠加多个视频

    我想以指定的时间间隔将多个视频叠加在单个视频上 尝试过不同的解决方案 但它不会像我一样工作 我使用下面的命令将视频叠加在视频上 String cmdWorking3 new String i yourRealPath i gifVideoF
  • 自动链接属性与实际链接不同的文本(setAutoLinkMask)

    例如 TextView tv TextView this findViewById R id tv tv setAutoLinkMask Linkify ALL tv setText visit website http www googl
  • 在 IIS7 上将多个域指向一个网站

    这与 SEO 没有任何关系 请不要发布任何有关 SEO 排名的内容 因为它不是这里的一个因素 我有2个网址 old websitename com 和 new websitename com 我需要在一定的时间内支持这两个 url 而不是在
  • 通过Python中的selenium驱动程序将图像导入谷歌表单

    我正在尝试将图像导入谷歌表单 我无法通过 xpath 将密钥传递给元素 看来这是一个隐藏的元素 我尝试执行脚本来取消隐藏它 但没有成功 也尝试过这个解决方案 如何使用 Selenium WebDriver python 访问隐藏的文件上传字
  • C++ 中的 Stringstream 解析单词和数字字符串

    我有这样的字符串 123加43次7 其中数字后面跟着字典中的单词 我知道我可以使用以下命令提取 int numbers gt gt 操作员 StringStream gt gt number 我可以拿到号码 然而 Stream 中仍然有该号
  • 将 JFrame 方向设置为从右到左!

    为了从右到左对齐我的 JFrame 我使用 setComponentOrientation ComponentOrientation RIGHT TO LEFT 但这仅当我使用 JFrame 的以下样式 装饰 时才有效 public cla
  • 如何使用 JaCoCo 忽略内部/嵌套类?

    我试图忽略一些生成的类 并且这些类被很好地忽略 但是 如果这些类具有内部类 则尽管父类被排除 但这些类仍然会被包含在内 这是我的配置
  • Asp.Net 3.5 路由到 Web 服务?

    我一直在寻找一种路线http www example com WebService asmx http www example com WebService asmx to http www example com service http
  • PhoneGap支持普通网络吗?

    phoneGap是否支持普通网页 如果支持的话我可以给我一个可以浏览的链接吗 thanks sri 当然 它可以加载到您现有的 UIWebView 实例中 或者加载到 ChildBrowser 中plugin http github com
  • 在 vim 中全局追加到具有匹配术语的行

    我确信这很容易 我只是缺少一两个字符 我需要在文件中搜索特定术语 当找到它时 我需要在该行添加一些内容 我想对比赛的每一行都这样做 要执行一次 我可以这样做 Thing to find s Stuff to append 简单的 如果我的
  • Java SSLHandshakeException:没有共同的密码套件

    我正在尝试使用 Java SSLSockets 将安全性应用于简单的聊天应用程序 我创建了一个自签名 CA 并用它签署了两个证书 全部使用 RSA 密钥 一个用于服务器 一个用于客户端 之后 我将证书导入到服务器的密钥库和客户端的另一个密钥
  • OS X 下 JRE 8 的 /lib/security 文件夹在哪里? [复制]

    这个问题在这里已经有答案了 我正在 OS X 下从 Java JRE 8 搜索文件夹 lib security 在 Windows 下 fodler 位于 java 安装目录的子文件夹 lib security 中 例如 C Program
  • ObservationCollection 使用 MVVM 架构在 PCL 内的 ViewModel 中实现 ISupportIncrementalLoading 以支持 WinRT 和 WP8/WinPRT

    我的 ViewModel 位于 PCL 内 因为我正在并行开发 Windows 8 1 和 Windows Phone 应用程序 我的 ViewModel 中有一个作为 ObservableCollection 的内容列表 我在 Windo
  • 深入学习 C# 表达式树的最佳资源是什么?

    当我第一次输入这个问题时 我这样做是为了找到重复的问题 我确信一定有人已经问过这个问题 我的计划是关注那些重复的链接 而不是发布这个问题 但据我所知 这个问题以前没有被问过 它没有出现在 相关问题 列表中 您找到了哪些用于深入了解 C 表达
  • Git 文件超出了符号链接范围

    我遇到了一个问题 Git 认为文件超出了符号链接的范围 因此无法对其进行版本控制 但它似乎是一个真实的文件 root r1 h stat f conf core site xml File conf core site xml ID 5c7
  • AQL 构建域对象不返回结果

    我遇到了一个问题 即使用 AQL 时无法返回对构建域对象进行的任何查询 当我进行以下卷曲时 curl X GET H X JFrog Art Api myArtifactroyKey H Cache Control no cache htt
  • .value_counts() 给出截断的结果

    我有一个 Excel 文件 其中有一列包含多个单词 我正在尝试计算每个单词出现的频率 所以如果我有一个清单 Labels a a b b c c c 输出应该是 c 3 b 2 a 2 我正在使用以下代码片段 import pandas a
  • Haskell 中的有限自动机

    在 Haskell 中表示有限自动机的好方法是什么 它的数据类型是什么样的 在我们学院 自动机被定义为 5 元组 Q X delta q 0 F 其中 Q 是自动机状态的集合 X 是字母表 这部分是否必要 delta 是从 Q X 获取 2