假设我们有一个函数sqrt的示例,它为我们提供浮点数的平方根,但不会在负输入时中止。那么sqrt的类型是什么。
我被告知答案是:
sqrt :: Maybe Float -> Float
然而,我不明白Maybe是做什么的,它仅仅意味着我们可以提供任何东西作为输入,还是意味着其他东西。
我撤回了我的投票结果,尽管另一个问题的最高答案或多或少地回答了这个问题,但它本身并不是一个真正的骗局。
首先,让我们谈谈参数化类型。
如果我说(语言不可知论)
Array<String>
我们有一个字符串数组。字符串数组["foo","bar"]
的类型为Array
也许
也是这样工作的,您有一个(在本例中)a也许Float
可以是Just Float
或没什么
。现在,就像编译器不会让您将整数列表传递给接受int的函数一样,它不会让您将也许T
传递给接受T
类型的函数。您必须处理没什么
的情况,类型系统防止遗漏处理失败情况。所以你的sqrt函数应该有签名
sqrt :: Float -> Maybe Float
为了反映这样一个事实,尽管您可以传入任何浮点数,但如果参数为负,结果可能不存在。
*为了讨论的目的。
也许
是一个具有简单定义的类型构造函数:
data Maybe a
= Just a
| Nothing
此语法读作“创建一个名为也许
的新类型构造函数,它接受一个类型参数。它有两个值构造函数:Just
,它接受a
类型的单个参数,或无
。”
当我们编写的函数接受一个可能
参数时,我们可以对其进行模式匹配来处理这两种情况。
foo :: Maybe String -> String
foo (Just str) = str
foo Nothing = "There was nothing!"
如果一个函数没有一个对所有输入都有意义的定义,那么我们可以使用或者
来说明这一点。例如,前奏曲中的
sqrt
返回负值的NaN
。我们可以编写一个不同的版本,返回也许
:
import qualified Prelude
import Prelude hiding (sqrt)
sqrt :: Float -> Maybe Float
sqrt x
| x < 0 = Nothing
| otherwise = Just (Prelude.sqrt x)
我们可能会将这种类型解读为“如果你给我一个浮点数,那么我可能会返回一个浮点数。”
我一直在学习Haskell,我做了一些统计函数,这些函数可以用于或类型的列表 以下是两个示例: 然而,我现在想知道我是否可以通过以不同的方式编写来改进运行时。像这样: 或者像这样: 我不知道哈斯克尔在屏幕后面是怎么处理的。在原始版本中,计算机是否为中的每个条目计算?我想Haskell不会在背景中优化理解。我错了吗?
本文向大家介绍Haskell基本清单理解,包括了Haskell基本清单理解的使用技巧和注意事项,需要的朋友参考一下 示例 Haskell具有列表理解,这很像数学中的集合理解,以及类似命令式语言(如Python和JavaScript)的类似实现。最基本的列表理解采用以下形式。 例如 函数也可以直接应用于x: 这等效于: 例:
问题内容: 我是C ++ / Java程序员,在日常编程中碰巧使用的主要范例是OOP。在某个线程中,我读到一条评论,即Type类本质上比OOP更直观。有人可以用简单的词来解释类型类的概念,以便像我这样的OOP家伙可以理解吗? 问题答案: 首先,我总是非常怀疑这种程序结构更直观。编程是违反直觉的,并且总是会因为人们自然而然地根据特定情况而不是一般规则来思考。要更改此设置,需要培训和实践,也称为“编程
我对哈斯克尔有意见。我有这样的文本文件: 我不知道如何获得前两个数字(上面的2和7)和最后一行的列表。每行的末尾都有点。 我试图构建一个解析器,但名为readFile的函数返回名为IO String的Monad。我不知道如何从那种字符串中获取信息。 我更喜欢在一系列角色上工作。也许有一个函数可以将“IO字符串”转换为[Char]?
我正在进行一个在线课程,其中一个问题要求我们根据列表中的索引将名称与基于以下列表和字典的关键字的理解中的工资相匹配: 期望输出: 我写了以下内容: 返回一个空集。 有人能给我一两个提示(不是代码答案)如何解决这个问题吗? 谢谢
在过去的几个月里,我一直在学习Haskell,我遇到了一个Monoid的例子,这让我感到困惑。 根据这些定义: 还有这棵树: 示例来源:http://learnyouahaskell.com/functors-application-functors-and-monoids#monoids