Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可比性在Elm中是什么意思?_Elm - Fatal编程技术网

可比性在Elm中是什么意思?

可比性在Elm中是什么意思?,elm,Elm,我很难理解Elm中的可比到底是什么。埃尔姆似乎和我一样困惑 在REPL上: > f1 = (<) <function> : comparable -> comparable -> Bool 所以看来String是可比较的 > f2 = (<) 1 <function> : comparable -> Bool > f2 "a" As I infer the type of values flowing through y

我很难理解Elm中的
可比
到底是什么。埃尔姆似乎和我一样困惑

在REPL上:

> f1 = (<)
<function> : comparable -> comparable -> Bool
所以看来
String
是可比较的

> f2 = (<) 1
<function> : comparable -> Bool
> f2 "a"
As I infer the type of values flowing through your program, I see a conflict
between these two types:

    comparable

    String
所以
String
不是可比的吗?

为什么
f2
的类型不是
number->Bool
f2
可以接受哪些其他可比数据?

我认为这个问题可能与此相关
Int
String
都是
可比的
,因为字符串可以与字符串进行比较,而Int可以与Int进行比较。可以接受任意两个可比项的函数将具有签名
compariable->compariable->…
,但在函数的任何一个求值中,两个可比项必须是相同的类型

我认为上面之所以把
f2
弄糊涂,是因为
1
是一个
number
而不是一个具体的类型(这似乎阻止了编译器认识到可比类型必须是某种类型,可能应该是固定的)。如果你要做:

i = 4 // 2
f1 = (<) i   -- type Int -> Bool
f2 = (<) "a" -- type String -> Bool
i=4//2
f1=(布尔)
f2=(布尔)

如果可以,您会看到它实际上会折叠到正确的类型。

通常,当您在Elm的类型中看到类型变量时,此变量是无约束的。当您提供特定类型的内容时,该变量将被该特定类型替换:

-- says you have a function:
foo : a -> a -> a -> Int
-- then once you give an value with an actual type to foo, all occurences of `a` are replaced by that type:
value : Float
foo value : Float -> Float -> Int
comparable
是一个具有内置特殊含义的类型变量。这意味着它将只与“comparable”类型匹配,例如
Int
String
和其他一些类型。但在其他情况下,它的行为应该是相同的。因此,我认为类型系统中存在一个小缺陷,假设您得到:

> f2 "a"
As I infer the type of values flowing through your program, I see a conflict
between these two types:

    comparable

    String
如果没有bug,您将得到:

> f2 "a"
As I infer the type of values flowing through your program, I see a conflict
between these two types:

    Int

    String

编辑:我为这个bug打开了一个更新:

由于@charlie inputs,我包括以下内容:

比较任意两个可比较的值。可比较的值包括
String
Char
Int
Float
Time
,或包含可比较值的
列表
元组。这些值也是唯一可用作Dict键或Set成员的值

摘自elm文件:-

旧版本:

可比较的类型包括
数字
字符
字符串
,~
可比较事物的列表
,以及可比较事物的元组 具有7个或更多元素的元组是不可比较的;为什么您的元组是可比较的 这么大

这意味着:

[(1,“字符串”),(2,“另一个字符串”)]
列表(Int,字符串)
-具有可比性

但是有

(1,“string”,True)
(Int,string,Bool)

[(1,真)、(2,假)]
列表(Int,Bool)
-尚不可比较

讨论了这个问题

注意:当人们试图在Dict中使用联合类型作为键时,通常会遇到
compariable
类型的问题

联合类型的标记和构造函数是不可比较的,因此下面的代码甚至无法编译。


通常当您尝试这样做时,会有一种更好的方法来处理您的数据结构。但在决定之前,可以使用-an。

谢谢。我看到Evan已将其确定为一个bug。作为将来的参考,该bug在2015年底修复。
可比的
可以在此处找到:您似乎阅读了我问题的标题,但没有阅读完整内容。我当时的困惑是因为编译器中有一个bug。被选为正确答案的答案引用了这个bug。@z5h是的,你在这方面是对的。不过,我认为我的答案是相关的,因为这个问题是Google中弹出的第一个问题——一旦一个刚接触elm的人试图理解什么是
的意思。我的答案是为了他们——因为我自己浪费了20分钟——去理解这个可比性到底是什么——我惊讶地发现,
Bools
被认为是不可比的。选择的答案解释道:“Int、String和其他一些”-不太具体。这就是我包含elm文档片段的原因。此答案已过时。该引用和链接指向旧版本的elm core(此处为新版本:)Elm不能再有两个以上成员的元组。@Charlie
Elm不能再有两个以上成员的元组
-这是什么意思?Elm接受
(1,2,3)
。它不接受
(1,2,3,4)
而且它迫使你使用一个命名的记录-这是个好主意。你仍然可以使用
((1,2,3),4)
来绕过它,但是使用记录对所有参与的人来说都要好得多,因为它不会增加记住你在第3和第4位想要什么值的认知负荷。我会更新答案。好的,我是说“Elm的元组成员不能超过三个”
> f2 "a"
As I infer the type of values flowing through your program, I see a conflict
between these two types:

    Int

    String
type SomeUnion = One | Two | Three
Dict.fromList [ (One, "one related"), (Two, "two related") ] : Dict SomeUnion String