如何在Elm中实现继承 type alias Car={model:model,year:Int} 型号=Crv |恩佐|野马|蝰蛇 --我能做到 enzo=汽车enzo--部分控制器 >myE:Int->Repl.Car myEnzo=enzo 2018 >{model=Enzo,year=2018}:Repl.Car --但我不能这样做 enzo2017=汽车{年份:2017}--无效

如何在Elm中实现继承 type alias Car={model:model,year:Int} 型号=Crv |恩佐|野马|蝰蛇 --我能做到 enzo=汽车enzo--部分控制器 >myE:Int->Repl.Car myEnzo=enzo 2018 >{model=Enzo,year=2018}:Repl.Car --但我不能这样做 enzo2017=汽车{年份:2017}--无效,elm,Elm,我如何制作一个简单的构造函数,而不强迫我按定义的顺序列出属性。当涉及到函数式编程时,我们需要用一些概念“重新开始”。在本例中,混淆似乎与构造器一词有关。 Elm中的记录构造函数不同于面向对象语言中的对象构造函数 记录构造函数不创建记录,它只创建一个可以创建记录的函数。它通过部分应用来实现这一点 在部分应用程序中,只能按参数的顺序给出参数。这是在lambda演算中定义的,我相信它不是特定于Elm的。 在使用记录构造函数创建记录的情况下,更改参数的顺序不会更改结果 我们可以使用这个方便的函数flip

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

当涉及到函数式编程时,我们需要用一些概念“重新开始”。在本例中,混淆似乎与构造器一词有关。 Elm中的记录构造函数不同于面向对象语言中的对象构造函数

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

在部分应用程序中,只能按参数的顺序给出参数。这是在lambda演算中定义的,我相信它不是特定于Elm的。 在使用记录构造函数创建记录的情况下,更改参数的顺序不会更改结果

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

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

在定义此项时,请考虑:

enzo2017 = flip Car 2017
myEnzo2017 = enzo2017 Viper
您真正得到的是一个功能
Car
,如下所示:

type alias Car = { model : Model, year: Int, notes: String}
>汽车
>:Repl.Model->Int->String->Repl.Car
定义另一个构造函数很容易:

> Car
> <function> : Repl.Model -> Int -> String -> Repl.Car
>f notes车型年=车型年备注
>:String->Repl.Model->Int->Repl.Car

您能提供更多的上下文吗?您的示例与继承的关系尚不清楚。此外,您不能仅用已初始化字段的子集来初始化
Car
的实例。@vijoc确实在尝试使用带有“构造函数”函数的部分应用程序来创建伪后代“构造函数”。谢谢,这很聪明,但是,它不能解决部分构造记录的一般情况,如果我们有更复杂的记录/类型别名,则可能存在可读性问题。我同意它不能解决定义的问题,并且我同意可读性问题,如果有两个以上的参数,这将非常糟糕。然而,试着离开面向对象的思维模式,看看你是否真的需要部分构建一个记录。这是Elm的安全机制之一,有助于防止错误。当我第一次遇到这个问题时,我尝试将一些变量转换成Maybes。像那样使用记录最终是错误的。但是这个练习让我思考为什么/在哪里我需要Maybes以及使用“部分”记录的含义。这太棒了,这就是我需要的。在工厂中使用destructure,我认为这可能是理想的解决方案
createnzo:{year:Int}->Car
,有没有办法让预解构上的签名更容易一些?e、 g.
从Car struct中省略“model”
如果您最终将一辆车从一个函数中取出,那么在某个点上,一个模型必须进入该函数(或可以生成模型的东西)。因此,我们无法避免左侧的模型。如果您的车型并不总是需要字段(例如notes)然后你需要2个构造函数:<代码>类型CAR= CARENOTENS模型INTING String CAREOUTNOTENS模型INT/COME >但是现在所有处理汽车的代码都需要考虑2个案例。我觉得在将来的某个时候,一个更好的构建记录的方法需要在ELM中存在,以便真正地对OOP用户进行虹吸。
> f notes model year = Car model year notes
> <function> : String -> Repl.Model -> Int -> Repl.Car