Maybe 应该用来保存错误消息吗?

2024-03-26

我有一个 Haskell 函数,它接受用户输入,还有另一个函数验证此输入。当然,验证可能会失败,在这种情况下,我想返回一条错误消息,提供有关错误操作的一些反馈。

我知道有很多方法可以做到这一点。根据我的一点经验,似乎最好的方法是使用Either String a。让我失望的是我不关心a。要么失败并且我想存储更多信息,要么成功。这a被浪费了。

正在使用Maybe String存储错误消息的可接受的方式?对我来说这感觉是倒退的,但完全忽略了右边的价值Either感觉也很不好。这里什么是规范的?


我鼓励使用Except String () (or Either String ()) over Maybe String,出于以下几个原因:

  • 稍后您可能会发现验证函数返回数据结构的某些部分很方便。例如,在验证String是电话号码,您可能想要返回区号、号码的第一部分和第二部分,给出如下验证类型String -> Except String (Int, Int, Int)或类似的。使不返回任何有趣内容的验证器具有类型Foo -> Except String ()使它们只是这种模式的一个特例——因此更容易组合在一起。
  • 继续“组合在一起”部分,您稍后可能会发现您想要用较小的验证器构建一个大型验证器。也许您有一个验证器来检查一个人是否指定了有效的年龄和出生日期,并且希望以此构建一个验证器来检查年龄是否与出生日期相符。这Monad实例为Either会在这里提供帮助;例如:

    validatePerson p now = do
        age <- validateAge p
        date <- validateBirthdate p
        validateMatchingAgeAndDate age date now
    

    或者也许有两种方法可以正确验证某些值,而您希望允许其中一种。然后bigValidator v = option1 v <|> option2 v是一种结合两种验证方式的廉价而愉快的方式。

    附带的好处是,这些结合现有验证器来创建更大验证器的方法将立即被其他 Haskellers 所识别。

  • 有一个非常强烈的约定Nothing是一个失败。使用相反的约定并不是problem,这是必然的,但可能会让其他贡献者感到困惑,也可能在不久的将来让你自己感到困惑。

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

Maybe 应该用来保存错误消息吗? 的相关文章

  • 将元组列表转换为列表列表 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
  • Hive - 通过聚合跨组的值来创建映射列类型

    我有一个看起来像这样的表 customer category room date 1 A aa d1 1 A bb d2 1 B cc d3 1 C aa d1 1 C bb d2 2 A aa d3 2 A bb d4 2 C bb d4
  • 使用 stack 安装 shuffle 库时出错

    Using stack 1 2 0 and LTS 7 0我在安装时遇到以下错误shuffle https hackage haskell org package shuffle 图书馆 cabal get shuffle cd shuff
  • Haskell 重叠/不连贯的实例

    我知道这段代码有点傻 但有人可以解释为什么吗isList 42 回报True然而isList2 42 prints False 以及如何防止这种情况发生 我想更好地理解一些更晦涩的 GHC 类型扩展 我认为这将是一个有趣的例子 LANGUA
  • 如何在函数式编程中为AST节点生成稳定的id?

    我想将一个特定的 AST 节点替换为另一个节点 并且这个替换的节点是由交互式用户输入指定的 在非函数式编程中 可以使用可变数据结构 并且每个AST节点都有一个对象引用 因此当我需要引用特定节点时 我可以使用这个引用 但在函数式编程中 使用I
  • 获取函数/类构造函数的参数类型

    我正在尝试做一些我不确定在 TypeScript 中是否可行的事情 从函数推断参数类型 返回类型 例如 function foo a string b number return a b type typeA
  • 由相同数据类型的不同构造函数共享的 Haskell 记录访问器

    关于 Haskell 记录的基本问题 如果我定义这个数据类型 data Pet Dog name String Cat name String deriving Show 以下作品 main do let d Dog name Spot c
  • 不同种类的ReaderT?

    冒着成为一个XY问题 https en wikipedia org wiki XY problem 是否有可能有一个ReaderT与不同的环境 我正在尝试类似 type AppM perms ReaderT perms IO 但是编译器抱怨
  • 精度和规模有什么区别?

    Oracle中精度和小数位数有什么区别 在教程中 他们通常在创建主键时将比例保留为空并将精度设置为 6 精度和规模代表什么 精度 4 尺度 2 99 99 精度 10 小数位数 0 9999999999 精度 8 标度 3 99999 99
  • 用户状态(秒差距)

    我正在使用秒差距解析一个表达式 并且我想使用秒差距中的用户状态来跟踪这些表达式中的变量 不幸的是我真的不知道该怎么做 给出以下代码 import Data Set as Set inp x y z data Var V String var
  • 使用 Rank2Types 相比 RankNTypes 有什么优势吗?

    据我所知 仅 针对 2 级类型存在可判定的类型检查算法 GHC 是否以某种方式利用了这一事实 它有任何实际意义吗 是否还有 2 级类型的主要类型概念和类型推断算法 如果是的话 GHC 使用它吗 与Rank 2类型相比 Rank 2类型还有其
  • 什么是 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
  • Haskell FFI - 你能从 Haskell 数据结构中获取 C 指针吗?

    我有很多 C 结构体 结构如下 typedef struct unsigned int a unsigned int b StructA 还有很多功能 比如 void doSomethingWith StructA StructB Stru
  • macOS 上的堆栈构建

    我是新来的haskell 我有最简单的程序 usr bin env stack stack resolver lts 13 7 script module Main where import Lib main IO main putStrL
  • 使用不带标签的 Core.Std.List.fold_left

    我正在尝试 Core 的List fold left List fold left a Core Std List t gt init b gt f b gt a gt b gt b
  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc

随机推荐

  • 如何检查我的应用程序是否在 android 中运行(不是作为服务)?

    Problem 我必须检查我的应用程序是否正在运行 当服务已经在后台运行时 基于它 我应该启动特定的活动或应用程序 我尝试或想出但失败的事情我尝试检查当前正在运行的进程 并根据它尝试确定应用程序是否正在运行 失败原因 获取应用程序运行状态一
  • 如何使用 CGImageRef 图像在 NSView 中显示图像

    我想在 NSview 或 NSImageView 中显示图像 在我的头文件中我有 interface FVView NSView NSImageView imageView end 这是我在实现文件中尝试做的事情 void drawRect
  • 将日期时间转换为时间戳并再次转换回来

    我在 Python 中的日期时间方面遇到了一些问题 我尝试将日期时间转换为时间戳 然后再转换回来 无论我如何尝试 最终结果都不一样 我总是以 datetime 2014 1 30 23 59 40 1998 的日期时间结束 import d
  • 使用 REST 是否必须使用适当的方法类型(POST、PUT、GET、DELETE)?

    我们在项目中使用 REST 调用 Web 服务来处理从用户界面进行的所有调用 目前 对于每个方法 签名都是以这种方式配置的 public class SaveNewAddressLabelService GET Consumes appli
  • XSLT 删除任意重复的同级元素

    答案here https stackoverflow com a 16715399 288341正在做我想要的事情 除了我不想只删除特定元素的重复同级元素 我想删除所有元素的重复同级元素 此外 出于我的目的 重复 元素将具有与其同级元素相同
  • Array.map 的 Javascript 性能

    刚刚在 jsperf 中编写了一些测试用例来测试使用时命名函数和匿名函数之间的区别Array map和其他替代方案 http jsperf com map reduce named functions http jsperf com map
  • Flask_migrate 可以在数据库初始化文件中与 sqlAlchemy create_engine 一起运行吗?

    如果我有一个init py 文件如下所示 from sqlalchemy import create engine import os from sqlalchemy orm import sessionmaker scoped sessi
  • CSS3 Internet Explorer 缩放背景过滤器:

    我正在尝试拉伸背景图像 使其始终填充窗口 使用 CSS3 我已经在 mozilla 和 chrome 中管理它 但是在 IE 中却遇到了困难 我以前在 IE 中管理过这个 但这次不起作用 这是我的 HTML 和 CSS HTML5
  • 如何从序列中提取升序子集?

    我有一些数据 id serial 1 1 2 2 3 3 4 1 5 3 6 2 7 1 8 2 9 3 10 1 11 2 12 1 13 2 14 3 我想按 串行 列进行分组 其中组规则是 任何升序子集 像这样 1 gt 2 gt 3
  • 编写 xml 并读回 c#

    好的 我现在使用文档方法而不是 XmlWriter 来编写 XML 我已经用 编写了我的 XML 文件 userNode xmlDoc CreateElement user attribute xmlDoc CreateAttribute
  • Rails + Android 中的 Authenticity_token

    我正在开发一个与 Rails 服务器通信的 Android 应用程序 我不想忽略authenticity token 但我也不认为询问它是正确的答案 如何保护我的 POST 请求 当您使用 API 时 像 Android 应用程序那样需要真
  • 计算 R 中具有不同权重的组的一系列加权平均值

    我有以下数据集 实际数据的简单版本 data 并且想分别使用权重 w1 和 w2 计算变量 x1 和 x2 的加权平均值 分为两组 由变量 n 确定的组 data lt data frame n c 1 1 1 2 2 2 x1 c 4 5
  • 合并重复行

    我有一个数据框 其中一列是物种名称 第二列是丰度值 由于采样程序的原因 某些物种出现多次 即 其中有不止一排物种 X 我想合并这些条目并总结它们的丰富性 例如 给定这个数据框 set seed 6 df data frame x c sp1
  • Python 回文程序无法运行

    我用 python 编写了一个简单的程序 它检查句子是否是回文 但我不明白为什么它不起作用 结果始终为 False 有谁知道出了什么问题吗 def isPalindrome word Removes all spaces and lower
  • PhoneGap Hello World 更改方向

    这很愚蠢 但如果我运行phonegap创建一些App 然后编辑config xml文件
  • 如何只允许在原始 SVG 的范围内平移

    Question 我想限制 SVG 的平移 这样当没有应用缩放时 就不可能进行平移 但是当您放大时 您可以在 SVG 的边界内平移 视觉示例 在下图中 中心的缩放视口可以平移到 SVG 的边缘 但不能进一步平移 然而这与泛示例 http a
  • 更改数组中的现有对象但仍保留键的唯一性

    我有一个文件 profile set name nick options 0 name joe options 2 name burt options 1 如果我想add新对象profile set only if the name对象的尚
  • 终止后启动带有推送通知的应用程序

    我想知道是否有办法唤醒 ios8 9 上已被用户终止的应用程序 我所说的终止是指双击主页按钮并向上滑动 是否可以通过发送静默推送通知来启动应用程序 以便didreceiveremotenotification被解雇并给我一些时间 我注意到我
  • AS3 - 如何让鼠标光标单击按钮?

    在我的应用程序中 我有一个连接到鼠标的鼠标光标 然而 它不允许我单击应用程序中的按钮 这对我来说是一个大问题 因为按钮对于我需要做的事情至关重要 我是 AS 新手 因此我们将不胜感激 stage addEventListener Mouse
  • Maybe 应该用来保存错误消息吗?

    我有一个 Haskell 函数 它接受用户输入 还有另一个函数验证此输入 当然 验证可能会失败 在这种情况下 我想返回一条错误消息 提供有关错误操作的一些反馈 我知道有很多方法可以做到这一点 根据我的一点经验 似乎最好的方法是使用Eithe