如何在榆树中完成继承

时间:2018-01-29 07:53:19

标签: elm

type alias Car = { model : Model, year: Int }


type Model = Crv | Enzo | Mustang | Viper

-- I can do this
enzo = Car Enzo -- partial Contructor
> myE<function> : Int -> Repl.Car

myEnzo = enzo 2018 
> { model = Enzo, year = 2018 } : Repl.Car

-- but i CANNOT do this
enzo2017 = Car { year: 2017 } -- INVALID

如何制作一个简单的构造函数,它不会强迫我按定义的顺序列出属性。

2 个答案:

答案 0 :(得分:5)

在功能编程方面,我们需要“重新开始”一些概念。在这种情况下,混淆似乎与构造函数一词有关。 Elm中的记录构造函数与面向对象语言中的对象构造函数不同。

记录构造函数不创建记录,它只创建可以创建记录的函数。它通过部分应用来实现。

在部分申请中,您只能按顺序提供参数。这是在lambda演算中定义的,我相信它不是特定于Elm。 在使用记录构造函数创建记录的情况下,更改参数的顺序不会对结果进行更改。

我们可以使用这个方便的函数 flip 以相反的顺序返回相同的函数:

enzo2017 = flip Car 2017
myEnzo2017 = enzo2017 Viper

答案 1 :(得分:3)

当你定义它时,请考虑:

type alias Car = { model : Model, year: Int, notes: String}

你真正得到的是一个像这样的函数Car

> Car
> <function> : Repl.Model -> Int -> String -> Repl.Car

定义另一个构造函数很容易:

> f notes model year = Car model year notes
> <function> : String -> Repl.Model -> Int -> Repl.Car