elm是否共享或复制对象?

elm是否共享或复制对象?,elm,Elm,我正在开发一个电子商务网站,前端是Elm,我想知道对象是共享的还是复制的。我对答案很有把握,但我只是想确定一下 基本上,我有一个ProductVariant,其中包含一些颜色。目前,ProductVariant作为一个字段color\u id:List colorId(这是我从json中获得的),但我正在考虑用颜色本身替换id:colors:List color。我可以在解码JSON后完成,我不需要在colors字典中查找颜色。假设每个颜色将在不同的变体之间共享,或者每个颜色将被复制,从而占用更

我正在开发一个电子商务网站,前端是Elm,我想知道对象是共享的还是复制的。我对答案很有把握,但我只是想确定一下


基本上,我有一个
ProductVariant
,其中包含一些
颜色
。目前,
ProductVariant
作为一个字段
color\u id:List colorId
(这是我从json中获得的),但我正在考虑用颜色本身替换id:
colors:List color
。我可以在解码JSON后完成,我不需要在
colors
字典中查找颜色。假设每个
颜色将在不同的变体之间共享,或者每个颜色将被复制,从而占用更多内存,这是正确的。

我制作了一个简单的程序来查看编译后的JS输出。用Elm码

type alias Color = { red: Int, green: Int, blue: Int }

black: Color
black = { red = 255, green = 255, blue = 255 }

white: Color
white = { red = 0, green = 0, blue = 0 }

red: Color
red = { red = 255, green = 0, blue = 0 }

colors: List Color
colors =
  [
    black,
    white,
    red,
    { red = 123, green = 234, blue = 11 },
    black,
    { red = 123, green = 234, blue = 11 },
    red,
    { red = 123, green = 234, blue = 11 }
  ]

输出的JS代码包含

var author$project$SharedData$colors = _List_fromArray(
    [
        author$project$SharedData$black,
        author$project$SharedData$white,
        author$project$SharedData$red,
        {blue: 11, green: 234, red: 123},
        author$project$SharedData$black,
        {blue: 11, green: 234, red: 123},
        author$project$SharedData$red,
        {blue: 11, green: 234, red: 123}
    ]);
这表明编译器能够重用预定义的颜色黑色、白色和红色,但在创建新记录时,即使使用完全相同的数据,也总会有重复

我不知道您的数据是如何组织的,但是对于上面的示例,我不会尝试优化数据结构,而是将颜色存储为十六进制代码字符串


我不是100%确定JS引擎如何处理字符串,但在许多其他平台上,单个字符串的堆中只有一个实例。对于上面的玩具应用程序,这意味着使用
“7BEA0B”
而不是
{red:123,green:234,blue:11}

我制作了一个简单的程序来查看编译后的JS输出。用Elm码

type alias Color = { red: Int, green: Int, blue: Int }

black: Color
black = { red = 255, green = 255, blue = 255 }

white: Color
white = { red = 0, green = 0, blue = 0 }

red: Color
red = { red = 255, green = 0, blue = 0 }

colors: List Color
colors =
  [
    black,
    white,
    red,
    { red = 123, green = 234, blue = 11 },
    black,
    { red = 123, green = 234, blue = 11 },
    red,
    { red = 123, green = 234, blue = 11 }
  ]

输出的JS代码包含

var author$project$SharedData$colors = _List_fromArray(
    [
        author$project$SharedData$black,
        author$project$SharedData$white,
        author$project$SharedData$red,
        {blue: 11, green: 234, red: 123},
        author$project$SharedData$black,
        {blue: 11, green: 234, red: 123},
        author$project$SharedData$red,
        {blue: 11, green: 234, red: 123}
    ]);
这表明编译器能够重用预定义的颜色黑色、白色和红色,但在创建新记录时,即使使用完全相同的数据,也总会有重复

我不知道您的数据是如何组织的,但是对于上面的示例,我不会尝试优化数据结构,而是将颜色存储为十六进制代码字符串


我不是100%确定JS引擎如何处理字符串,但在许多其他平台上,单个字符串的堆中只有一个实例。对于上面的玩具应用程序,这意味着使用
“7BEA0B”
而不是
{red:123,green:234,blue:11}

遵循@kaskelotti建议,我制作了一个小程序,从字典中两次提取相同的项,如果数据共享,则使用JS调试器进行检查

import Html exposing (text,div)

import Dict
a = {t= "My name is a"}
b = {t= "My name is B"}
d = Dict.fromList [("a", a), ("b", b)]

mytest = List.filterMap (\key -> Dict.get key d) ["a", "b", "a"]

main = 
    let x = mytest
       (y, z)=  case x of
                 [a1,_,a2] -> (a1,a2)
                 _ -> (a,b)

    in div [] (List.map (\o -> text o.t) mytest)

通过在
main
中设置断点,我可以检查
y
z
实际上是相同的(
y==z
为真)。同样修改
y.t
修改
z.t

根据@kaskelotti的建议,我制作了一个小程序,从字典中两次提取相同的项目,并使用JS调试器检查数据是否共享

import Html exposing (text,div)

import Dict
a = {t= "My name is a"}
b = {t= "My name is B"}
d = Dict.fromList [("a", a), ("b", b)]

mytest = List.filterMap (\key -> Dict.get key d) ["a", "b", "a"]

main = 
    let x = mytest
       (y, z)=  case x of
                 [a1,_,a2] -> (a1,a2)
                 _ -> (a,b)

    in div [] (List.map (\o -> text o.t) mytest)

通过在
main
中设置断点,我可以检查
y
z
实际上是相同的(
y==z
为真)。另外modify
y.t
修改
z.t

我也猜它会复制数据。这当然是实施细节,可能会有所改变。但由于所有数据都是不可变的,因此没有理由不能在内部共享。您可以制作一个小的测试Elm程序,看看编译后的JS输出是什么样子的。如果你走得那么远,把你的信息贴在这里让其他人知道细节。我也猜它会复制数据。这当然是实施细节,可能会有所改变。但由于所有数据都是不可变的,因此没有理由不能在内部共享。您可以制作一个小的测试Elm程序,看看编译后的JS输出是什么样子的。如果你走得那么远,把你的信息贴在这里让其他人知道细节。这真的很有帮助。在我的例子中,颜色实际上是一个单独的实体(具有名称、url、甚至图像等),因此将颜色存储为字符串不是一个选项。我更关心的是,当一个对象从字典中提取,然后通过一个函数,最后添加到某个地方时,是否会发生重复。这真的很有帮助。在我的例子中,颜色实际上是一个单独的实体(具有名称、url、甚至图像等),因此将颜色存储为字符串不是一个选项。我更关心的是,当从字典中提取一个对象,然后通过一个函数,最后添加到某个地方时,是否会发生重复。