当前位置: 首页 > 知识库问答 >
问题:

什么是也许类型,它是如何工作的?

程峻
2023-03-14

我刚刚开始在Haskell中编程,我遇到了以下定义:

calculate :: Float -> Float -> Maybe Float

共有1个答案

咸晨
2023-03-14

可能是一种普通的数据类型,定义如下:

data Maybe a = Just a | Nothing

因此有两种可能性:或者将类型为a的值定义为仅为a(比如仅为3),或者如果查询没有答案,则定义为

它被定义为定义非总体函数输出的一种方式。

例如:假设您要定义sqrt。平方根仅为正整数定义,因此您可以将sqrt定义为:

sqrt x | x >= 0 = Just $ ...
       | otherwise = Nothing

使用...一种计算x平方根的方法。

有些人将Nothing与大多数编程语言中的“空指针”进行比较。默认情况下,通过添加Nothing,您没有为您定义的数据类型实现空指针(如果实现了,所有这些“空”看起来都不同),您有一个通用的空指针。

因此,可以使用Maybe来表示可能无法计算输出。当然,在小于0的值上也可能出现错误:

sqrt x | x >= 0 = Just $ ...
       | otherwise = error "The value must be larger or equal to 0"

但是错误通常不会在类型签名中提及,如果不考虑它们,编译器也不会有任何问题。Haskell也在转向total函数:最好总是尝试至少为所有可能的输入返回一个值(例如Nothing)。

如果您以后想使用的结果,也许是,例如您需要编写:

succMaybe :: Maybe Int -> Maybe Int
succMaybe (Just x) = Just (x+1)
succMaybe _ = Nothing

但是,通过为第一种情况编写,你不知何故警告自己,可能什么都不会发生。您还可以通过引入一个“默认”值来摆脱Maybe

justOrDefault :: a -> Maybe a -> a
justOrDefault _ (Just x) = x
justOrDefault d _ = d

内置的maybe函数(注意小写字母)结合了前面两个函数:

maybe :: b -> (a -> b) -> Maybe a -> b
maybe _ f (Just x) = f x
maybe z _ Nothing  = z

所以你指定一个b(默认值)和一个函数(a-

使用也许会很困难,因为您总是需要考虑的情况,为了简化这一点,您可以使用也许单子。

Tom Schrijvers还展示了也许是类型代数中的后继函数:您向类型添加一个额外的值(要么是加法,(,)是乘法的类型代数等价物)。

 类似资料:
  • 为了减少内核或跨进程内存泄漏(Spectre攻击),Linux内核1将使用一个新选项编译,引入到,以便通过所谓的retpoline执行间接调用。 这似乎是一个新发明的术语,因为谷歌搜索只是最近才使用(通常都是在2018年)。 1但是,它不是Linux特有的--类似或相同的构造似乎被用作其他操作系统缓解策略的一部分。

  • 问题内容: 我不明白杰克逊的@JsonView( Views.MyClass.class )是什么。我知道我可以用这种方式注释POJO的字段和方法, 以过滤未 注释的字段和方法,以免它们被JSON序列化。但是,什么是Views.Myclass类?它是Jackson库的模板类吗? 为什么在Views类中可以有很多类?例如这样: 为什么需要它,它如何工作? 问题答案: 用于根据序列化的上下文过滤字段。

  • 伙计们,最近我决定回到PHP,做一些比简单的登录页面更复杂的事情。3年来,我一直在Java /JavaEE编程,对Java应用程序的体系结构有很好的理解。基本上,一个虚拟机(一个简单的操作系统进程)运行被称为字节码的编译代码。一个简单的Javaweb服务器基本上是一个java应用程序,它监听提供给Http请求的TCP端口,并相应地做出响应,当然它更复杂但这是它最初的工作。 现在,PHP怎么样?它是

  • 我搜索过,似乎这被称为列表理解,但它是如何工作的?

  • AAPT(安卓资产打包工具)是什么意思?它是如何工作的? 我可以使用AAPT将一个应用程序的文件发送到另一个应用程序的APK文件中吗?

  • 问题内容: 我不太了解其工作原理和作用。 我的主要目标是将它与配合使用以提高精度。 问题答案: 使用要跟踪字符串和重复值 通常按项目本身跟踪每个项目。对于给定的阵列,试图跟踪由每个变化的。问题是我们有重复的值,而角度将引发错误。解决该问题的一种方法是通过其他方式对对象进行角度跟踪。对于字符串,这是一个很好的解决方案,因为您实际上没有其他跟踪字符串的方法。 并触发摘要和输入焦点 您暗示您对角度有些陌