dud*_*-av 5 functional-programming elm
所以,我一直在Exercism.org上做 Elm track ,我刚刚完成了关于这个概念的练习Maybe,但有一件事我还不清楚。Just的定义中的目的是什么Maybe?
type Maybe a = Nothing | Just a
例如,Intand之间有什么区别,为什么如果我不在前面添加单词,则Just Int整数不被视为 a ?Just IntJust
更具体地说,当我尝试解决RPG 问题时,我的第一次尝试结果如下:
type alias Player =
{ name : Maybe String
, level : Int
, health : Int
, mana : Maybe Int
}
revive : Player -> Maybe Player
revive player =
case player.health of
0 ->
if player.level >= 10 then
Player player.name player.level 100 100
else
Player player.name player.level 100 Nothing
_ ->
Nothing
Run Code Online (Sandbox Code Playgroud)
只是为了发现我的错误是在 if 语句中,应该返回Just Person,即:
if player.level >= 10 then
Just (Player player.name player.level 100 (Just 100))
else
Just (Player player.name player.level 100 Nothing)
Run Code Online (Sandbox Code Playgroud)
Sil*_*olo 11
如果您有 Python 等动态类型的背景,那么很容易认为它毫无意义。在 Python 中,如果您有一个参数并且希望它是整数或空,则可以传递整数或None。每个人都知道这None是缺少整数。
即使您来自一种做得很差的静态类型语言,您可能仍然认为它很奇怪。在Java中,每个引用数据类型都是可以为空的,因此String实际上是“呃,这里可能有也可能没有String”,并且MyCustomClass实际上是“呃,这里可能有也可能没有实例”。一切都可以null,这就导致大家null每次都不断地检查事情是否是这样。
一般来说,这个问题有两种解决方案:可空类型和可选类型。在像 Kotlin 这样具有可为 null 类型的语言中,Int是整数类型。Int 只能包含整数。不是null,不是字符串,也不是其他任何东西。但是,如果您想允许null,则可以使用类型Int?。该类型Int?要么是整数,要么是null值,除非您先检查,否则您不能对其执行任何类似整数的操作(例如将其添加到另一个整数)null。null对于来自 Java 等语言的人来说,这是最直接的问题解决方案。在这个类比中,Intreal 是 的子类型Int?,因此每个整数都是 的实例Int?。是和3的实例,它既意味着“这是一个整数”,也意味着“这是一个可选但存在的整数”。IntInt?
这种方法在具有子类型的语言中效果很好。如果您的语言是从典型的 OOP 层次结构构建的,那么很容易说“嗯,T显然是……的子类型T?”并继续。但 Elm 并不是这样构建的。Elm 中没有子类型关系(有统一,这是另一回事)。Elm 基于 Haskell,它是根据Hindley-Milner 模型构建的。在此模型中,每个值都有唯一的类型。
而在 Kotlin 中,是、 andalso 、andalso 、andalso3的实例,一直到(Kotlin 中的顶级类型),而在 Elm 中没有对应的实例。不存在所有东西都继承自的“顶级类型”,也没有子类型。所以说它是多种类型的实例是没有意义的。在 Elm 中,是 的一个实例。故事结局。就是这样。如果函数采用 类型的参数,则它必须是整数。由于不能是其他类型的实例,我们需要另一种方式来表示“可能存在或不存在的整数”。IntInt?NumberNumber?Any?33IntInt3
type Maybe a = Nothing | Just a
Run Code Online (Sandbox Code Playgroud)
输入可选类型。3不能是可选整数,因为它Int只是一个。但是Just 3,另一方面...Just 3是一个完全不同的值,它的类型是Maybe Int。A仅Just 3在需要可选整数的情况下才有效,因为它不是. 就是所谓的可选类型;它是一个完全独立的类型,代表 type ,但可选。它以 Kotlin 等语言服务于相同的目的,但它是建立在不同的基础上的。IntMaybe aaT?
讨论哪一个更好会破坏这篇文章,我认为这在这里并不重要。我有我的看法,但其他人也有他们的看法。可选类型和可为空类型是处理可能存在或可能不存在的值的两种不同方法。Elm(和类似 Haskell 的语言)使用其中一种,其他语言可能使用另一种。一个全面发展的程序员应该对两者都感到满意。