可比性在Elm中是什么意思?
我很难理解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
可比到底是什么。埃尔姆似乎和我一样困惑
在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不能再有两个以上成员的元组。@CharlieElm不能再有两个以上成员的元组
-这是什么意思?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