Agda:用数字解析字符串

2023-11-21

我正在尝试用 Agda 中的自然数解析字符串。 例如,结果stringListToℕ "1,2,3"应该Just (1 ∷ 2 ∷ 3 ∷ [])

我当前的代码不太正确,或者无论如何都不太好,但它可以工作。 但是它返回类型:Maybe (List (Maybe ℕ))

问题是:

  1. 功能如何实现stringListToℕ以一种很好的方式(与我的代码相比); 它应该有类型Maybe (List ℕ)

  2. (可选,不重要)如何转换类型Maybe (List (Maybe ℕ)) to Maybe (List ℕ)?

My Code:

charToℕ : Char → Maybe ℕ
charToℕ '0' = just 0
charToℕ '1' = just 1
charToℕ '2' = just 2
charToℕ '3' = just 3
charToℕ '4' = just 4
charToℕ '5' = just 5
charToℕ '6' = just 6
charToℕ '7' = just 7
charToℕ '8' = just 8
charToℕ '9' = just 9
charToℕ _   = nothing

stringToℕ' : List Char → (acc : ℕ) → Maybe ℕ 
stringToℕ' []       acc = just acc
stringToℕ' (x ∷ xs) acc = charToℕ x >>= λ n → stringToℕ' xs ( 10 * acc + n )

stringToℕ : String → Maybe ℕ
stringToℕ s = stringToℕ' (toList s) 0 

isComma : Char → Bool
isComma h = h Ch.== ','

notComma : Char → Bool
notComma ',' = false
notComma _ = true 

{-# NO_TERMINATION_CHECK #-}
split : List Char → List (List Char)
split [] = []
split s = l ∷ split (drop (length(l) + 1) s)
    where l : List Char
          l = takeWhile notComma s

isNothing' : Maybe ℕ → Bool
isNothing' nothing = true
isNothing' _       = false

isNothing : List (Maybe ℕ) → Bool 
isNothing l = any isNothing' l

-- wrong type, should be String -> Maybe (List N)
stringListToℕ : String → Maybe (List (Maybe ℕ))
stringListToℕ s = if (isNothing res) then nothing else just res
              where res : List (Maybe ℕ)
                    res = map stringToℕ (map fromList( split (Data.String.toList s)))

test1 = stringListToℕ "1,2,3"
-- => just (just 1 ∷ just 2 ∷ just 3 ∷ [])

EDIT

我尝试使用编写一个转换函数from-just,但是在类型检查时会出现错误:

  conv : Maybe (List (Maybe ℕ)) → Maybe (List ℕ) 
  conv (just xs) = map from-just xs
  conv _ = nothing

错误是:

Cannot instantiate the metavariable _143 to solution
(Data.Maybe.From-just (_145 xs) x) since it contains the variable x
which is not in scope of the metavariable or irrelevant in the
metavariable but relevant in the solution
when checking that the expression from-just has type
Maybe (_145 xs) → _143 xs

我冒昧地重写了你的split函数变成更通用的东西,也适用于终止检查:

open import Data.List
open import Data.Product
open import Function

splitBy : ∀ {a} {A : Set a} → (A → Bool) → List A → List (List A)
splitBy {A = A} p = uncurry′ _∷_ ∘ foldr step ([] , [])
  where
    step : A → List A × List (List A) → List A × List (List A)
    step x (cur , acc) with p x
    ... | true  = x ∷ cur , acc
    ... | false = []      , cur ∷ acc

Also, stringToℕ ""最有可能的是nothing,除非你真的想要:

stringListToℕ "1,,2" ≡ just (1 ∷ 0 ∷ 2 ∷ []) 

让我们重写一下(注意helper是你原来的stringToℕ功能):

stringToℕ : List Char → Maybe ℕ
stringToℕ []   = nothing
stringToℕ list = helper list 0
  where {- ... -}

现在我们可以把它们放在一起。为了简单起见,我使用List Char到处撒上fromList/toList有必要的):

let x1 = s                   : List Char        -- start
let x2 = splitBy notComma x1 : List (List Char) -- split at commas
let x3 = map stringToℕ x2    : List (Maybe ℕ)   -- map our ℕ-conversion
let x4 = sequence x3         : Maybe (List ℕ)   -- turn Maybe inside out

你可以找到sequence in Data.List;我们还必须指定要使用哪个 monad 实例。Data.Maybe以名称导出其 monad 实例monad。最终代码:

open import Data.Char
open import Data.List
open import Data.Maybe
open import Data.Nat
open import Function

stringListToℕ : List Char → Maybe (List ℕ)
stringListToℕ = sequence Data.Maybe.monad ∘ map stringToℕ ∘ splitBy notComma

还有一个小测试:

open import Relation.Binary.PropositionalEquality

test : stringListToℕ ('1' ∷ '2' ∷ ',' ∷ '3' ∷ []) ≡ just (12 ∷ 3 ∷ [])
test = refl

考虑你的第二个问题:有很多方法可以改变Maybe (List (Maybe ℕ)) into a Maybe (List ℕ), 例如:

silly : Maybe (List (Maybe ℕ)) → Maybe (List ℕ)
silly _ = nothing

是的,这并没有多大作用。我们希望转换能够保留元素(如果它们全部)just. isNothing已经做了这部分检查,但它无法摆脱内部Maybe layer.

from-just could之所以有效,是因为我们知道当我们使用它时,List必须是just x对于一些x。问题是conv目前的形式是错误的 -from-just作为类型的函数Maybe A → A仅当Maybe值为just x!我们很可以做这样的事情:

test₂ : Maybe (List ℕ)
test₂ = conv ∘ just $ nothing ∷ just 1 ∷ []

自从from-list表现为Maybe A → ⊤当给予nothing,我们本质上是试图构建一个异构列表,其元素类型均为 and .

让我们放弃这个解决方案,我将展示一个更简单的解决方案(事实上,它应该类似于这个答案的第一部分)。

我们被赋予了一个Maybe (List (Maybe ℕ))我们给出了两个目标:

  • 采取内在的List (Maybe ℕ)(如果有),检查所有元素是否just x在这种情况下,将它们全部放入一个包含在just,否则返回nothing

  • 压扁两倍Maybe层层合而为一

嗯,第二点听起来很熟悉——这是 monad 可以做的事情!我们得到:

join : {A : Set} → Maybe (Maybe A) → Maybe A
join mm = mm >>= λ x → x
  where
    open RawMonad Data.Maybe.monad

这个函数可以与任何 monad 一起使用,但我们可以使用Maybe.

对于第一部分,我们需要一种方法来转变List (Maybe ℕ) into a Maybe (List ℕ)- 也就是说,我们希望在传播可能的错误时交换层(即nothing)进入外层。 Haskell 有专门的类型类来处理这类东西(Traversable from Data.Traversable), 这个问题如果您想了解更多信息,有一些很好的答案。基本上,这都是关于重建结构,同时收集“副作用”。我们会选择适合的版本Lists,我们回到了sequence again.

还缺少一块,让我们看看到目前为止我们已经有了什么:

sequence-maybe : List (Maybe ℕ) → Maybe (List ℕ)
sequence-maybe = sequence Data.Maybe.monad

join : Maybe (Maybe (List ℕ)) → Maybe (List ℕ)
  -- substituting A with List ℕ

我们需要申请sequence-maybe里面一Maybe层。那就是Maybefunctor 实例开始发挥作用(您可以单独使用 monad 实例来完成,但它更方便)。通过这个函子实例,我们可以提升类型的普通函数a → b转化为类型的函数Maybe a → Maybe b。最后:

open import Category.Functor
open import Data.Maybe

final : Maybe (List (Maybe ℕ)) → Maybe (List ℕ)
final mlm = join (sequence-maybe <$> mlm)
  where
    open RawFunctor functor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Agda:用数字解析字符串 的相关文章

  • Agda:用数字解析字符串

    我正在尝试用 Agda 中的自然数解析字符串 例如 结果stringListTo 1 2 3 应该Just 1 2 3 我当前的代码不太正确 或者无论如何都不太好 但它可以工作 但是它返回类型 Maybe List Maybe 问题是 功能
  • Agda 的 Haskell 推导机制

    我想知道 Agda 中是否有任何类似于 Haskell 的东西deriving Eq条款 那么我下面还有一个相关的问题 例如 假设我有一种玩具语言的类型 data Type Set where Nat Type Prp Type 然后我可以
  • Agda 中的 Arity 通用编程

    如何在 Agda 中编写 arity generic 函数 是否可以编写完全依赖且全域多态的泛型函数 我将以 n 元复合函数为例 最简单的版本 open import Data Vec N ary comp n X Set Y Set Z
  • 有限的数字如何运作? (依赖类型)

    我对依赖类型语言感兴趣 有限数对我来说似乎非常有用 例如 安全地索引固定大小的数组 但这个定义对我来说并不清楚 Idris 中有限数的数据类型可以如下 Agda 中可能类似 data FiniteNum Natural gt Type wh
  • Haskell 中 Idris 的 Fin 的首选替代方案是什么

    我想要一个可以包含 0 到 n 值的类型 其中 n 位于类型级别 我正在尝试类似的事情 import GHC TypeLits import Data Proxy newtype FiniteNat n FiniteNat toIntege
  • 为什么我们需要容器?

    作为借口 标题模仿了标题为什么我们需要单子 https stackoverflow com questions 28139259 why do we need monads 有容器 http www sciencedirect com sc
  • 证明唯一的零长度向量为零

    我有一个类型定义为 Inductive bits nat gt Set bitsNil bits 0 bitsCons forall l bool gt bits l gt bits S l 我试图证明 Lemma emptyIsAlway
  • F# 类型提供程序相关的嵌套类型

    我正在尝试构建一个嵌套的 TypeProviderProvidedProperty根据父级的类型值生成 我想要的结果如下 r bin Debug library dll open Library TypeProviders type sdm
  • 仅数学证明助理

    大多数证明助手都是具有依赖类型的函数式编程语言 他们可以证明程序 算法 相反 我感兴趣的是最适合数学且仅适合数学 例如微积分 的证明助手 你能推荐一个吗 我听说过 Mizar 但我不喜欢源代码被关闭 但如果它最适合数学 我会使用它 Agda
  • “Any-∃”练习的有效类型签名是什么?

    Exercise Any Show that Any P xs is isomorphic to x xs P x 撇开以下事实不谈 x xs P x甚至不是有效语法 https stackoverflow com questions 56
  • 异常类型和数据构造函数

    我不知道我怎么没有注意到这一点 但是数据构造函数和函数定义都不能使用除 和它的变种 gt 等 由于 gt 的友善签名 即使在 XPolyKinds 这是我尝试过的代码 LANGUAGE DataKinds LANGUAGE KindSign
  • 将排序列表与大小类型合并

    假设我们有一个排序列表的数据类型 具有与证明无关的排序见证 我们将使用 Agda 的实验性大小类型功能 这样我们就有希望在数据类型上获得一些递归函数来通过 Agda 的终止检查器 OPTIONS sized types open impor
  • 嵌套两次的 sizeof 可以成为依赖表达式吗?

    我注意到 gcc 5 0 拒绝以下代码 而 clang 3 6 接受它 template
  • 由 Scala 宏生成时,依赖类型似乎“不起作用”

    为这个挥手的标题道歉 我不完全确定如何简洁地表达这个问题 因为我以前从未遇到过这样的事情 背景资料 我有以下特征 其中类型U是为了举行无形可扩展记录 https github com milessabin shapeless wiki Fe
  • 使用标准库对 Agda 中的对/列表进行字典顺序排序

    Agda标准库包含一些模块Relation Binary Non StrictLex 目前仅适用于Product and List 我们可以使用这些模块轻松构建一个实例 例如IsStrictTotalOrder对于自然数对 即 open i
  • 如何在构造微积分中提取Sigma的第二个元素?

    我尝试这样做 A gt B A gt gt t r gt x a gt B x gt r gt r gt t B t A x A gt y B x gt x x A gt y B x gt y 请注意 由于该函数返回的值取决于 sigma
  • AGDA 中极浅嵌入 VHDL 的指南

    对于我的编程语言项目 我正在 agda 中做一个非常浅且简单的 VHDL 数字电路嵌入 目的是写出语法 静态语义 动态语义 然后写一些证明来展示我们对材料的理解 到目前为止我已经编写了以下代码 data Ckt Set where var
  • 如何构建具有依赖类型长度的列表?

    将我的脚趾浸入依赖类型的水域中 我对规范的 具有静态类型长度的列表 示例进行了破解 LANGUAGE DataKinds GADTs KindSignatures a kind declaration data Nat Z S Nat da
  • 通过(单子)join 和 fmap 进行终止检查替换

    我正在使用大小类型 并且有一个用于键入术语的替换函数 如果我直接给出定义 则终止检查 但如果我通过 单子 连接和 fmap 对其进行分解 则不会进行终止检查 OPTIONS sized types module Subst where op
  • Idris - 自定义相关数据类型上的映射函数失败

    我对 idris 和依赖类型相对较新 遇到了以下问题 我创建了一个类似于向量的自定义数据类型 infixr 1 data TupleVect Nat gt Nat gt Type gt Type where Empty TupleVect

随机推荐

  • 分析我的java代码发送的http流量的最佳方法?

    我有一些新的 使用 Apache commons http 库 和旧的 严格使用 java 1 4 API 的 java 代码 并且正在尝试使用较新的 apache commons 库重写旧代码 但是 它不起作用 我正在努力找出原因 请求正
  • 无法从 Windows 桌面应用程序“MySQL Workbench”连接到 MySQL 数据库(在 WSL2 上运行)

    我在适用于 Linux 的 Windows 子系统 WSL2 版本 上设置了 MySQL 我对 MySQL 比较陌生 但我已经确认了以下几点 它正在运行 ps ax grep mysqld返回一个值 它在默认主机上运行127 0 0 1 它
  • 使用 PHP 提取 Excel 文件 (xls) 中的图片/图像

    我有一个电子表格 想使用 PHP 导入 我可以使用 PHPExcel 导入单元格数据 但无法弄清楚如何使用电子表格中的图像 有没有办法做到这一点 然后使用 PHP 中的图像保存到服务器等 非常感谢您的帮助 Update mark baker
  • 使用 git 子树检出特定标签

    我可以在子树中使用标签吗 以下是具体问题 我有一个 git 存储库 其中包含一个外部存储库作为子树 我可以添加此外部存储库并从此存储库中签出特定分支 和git subtree pull prefix
  • 启动 AVD 模拟器 avd PANIC:无法打开:avd - Ubuntu 13.10

    我在 Ubuntu 上使用 android sdk 已经有一段时间了 最近 我将其升级到Ubuntu 13 10 从那时起 每当我尝试启动 Android 虚拟设备时 我都会收到此错误 Starting emulator for AVD A
  • 詹金斯 + qUnit

    如何轻松地将 Jenkins 与 qUnit 集成 我将使用真正的浏览器 如 Firefox 和 Chrome 来运行测试 我的服务器运行在 RedHat 6 1 Linux 上 我想我已经拥有所有需要的插件 库 但我仍然不知道如何使其工作
  • 赋值表达式和 volatile

    我似乎有一个合理的理解volatiles一般来说 但有一个看似晦涩的案例 我不确定事情应该如何按照标准进行工作 我已经阅读了 C99 的相关部分以及 SO 上的十几个或更多相关帖子 但找不到这种情况下的逻辑或解释这种情况的地方 假设我们有这
  • pandas 性能:列选择

    我今天观察到 选择两列或更多列数据框可能比仅选择一列慢得多 如果我使用 loc 或 iloc 选择多个列 并使用 list 传递列名或索引 那么与使用 iloc 选择单列或多列 但没有传递列表 相比 性能会下降 100 倍 例子 df pd
  • 扭曲:延迟重复触发?

    Deferred是在 Twisted 中进行异步处理的好方法 然而 顾名思义 它们用于延迟计算 仅运行和终止一次 触发回调一次 如果我进行重复计算 例如单击按钮 怎么办 有没有Deferred 类似可以重复触发的对象 每当触发时调用附加到它
  • 如何判断数据包是否是 TCP Keep-Alive?

    Wireshark 和网络监视器为此提供了过滤器 但我想知道如何通过查看标头或有效负载来推断数据包是 TCP Keep Alive 还是 Keep Alive Ack TCP 保活数据包是一个 ACK 其序列号设置为比序列号小 1 连接的当
  • 将unix时间戳转换为H2时间戳

    如何转换 unix 时间戳值1348560343598 to H2 Timestamp 我的一个表包含这些 un ix 时间戳BIGINT 19 列 我需要将它们转换为类型的列TIMESTAMP 好的 使用以下公式有效 select DAT
  • 不了解在系统架构中的何处创建 IoC 容器

    假设我有以下 4 个 net 程序集 Winform用户界面 商业逻辑 SQL Server 数据访问 实现 IRepository 通用接口 IRepository等的定义 我的业务逻辑 2 使用构造函数依赖注入通过 IRepositor
  • Python 的 SSH 模块

    我必须在远程计算机上完成一项工作 使用我的 Web 服务器 大约需要 10 分钟 我用过pxsshpython 中的模块相同 但它给了我 超时错误 非阻塞 现在 我正在使用paramiko但一旦发出指令 它就会回来 我希望网络服务器等待作业
  • UIImagePickerController 导航栏色调颜色不适用于 iOS 13

    我正在展示一个模态控制器 它是 UIImagePickerController 我正在尝试改变UIImagePickerController导航栏的色调颜色 在 iOS13 之前 这工作得很好 imagePickerController n
  • sqlserver中日期时间和时间戳之间的区别? [复制]

    这个问题在这里已经有答案了 有什么区别Timestamp and DatetimeSQL 服务器 我认为这两种格式都能够存储日期 时间 那么 他们之间的区别到底在哪里呢 But Timestamp无法存储日期 时间信息 还是有什么区别 Ac
  • 如何在 CameraX 上的相机预览中裁剪图像矩形

    我有一个自定义相机应用程序 它有一个居中的矩形视图 如下所示 当我拍照时 我想忽略矩形之外的所有内容 这是我的 XML 布局
  • Internet Explorer 上的 JSON 解析错误

    我正在使用 jscript 从 Flickr 检索 JSON 数据 除 IE 外 所有浏览器均可 100 正常工作 我正在使用 jquery every 函数为 IE 调用此特定函数 some code if browser msie wi
  • 如何将通用类型的类对象转换为该类型的特定实例

    我有一个通用接口 让我们调用它GenericInterface
  • 如何使用 vue-cli create 修复错误“没有这样的文件或目录错误”

    我安装了 vue cli 3 我尝试使用 vue create 创建一个 vue 应用程序 但出现 no such file 错误 vue create hello world bash usr local bin vue No such
  • Agda:用数字解析字符串

    我正在尝试用 Agda 中的自然数解析字符串 例如 结果stringListTo 1 2 3 应该Just 1 2 3 我当前的代码不太正确 或者无论如何都不太好 但它可以工作 但是它返回类型 Maybe List Maybe 问题是 功能