2015-08-07 13 views
9

Tôi đang gặp khó khăn khi hiểu chính xác một số comparable là gì trong Elm. Elm có vẻ bối rối như tôi.Điều gì có thể so sánh trung bình trong Elm?

Trên REPL:

> f1 = (<) 
<function> : comparable -> comparable -> Bool 

Vì vậy f1 chấp nhận so sánh.

> "a" 
"a" : String 
> f1 "a" "b" 
True : Bool 

Vì vậy, có vẻ như String là có thể so sánh.

> f2 = (<) 1 
<function> : comparable -> Bool 

Vì vậy, f2 chấp nhận so sánh.

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

    comparable 

    String 

Vì vậy Stringkhông thể so sánh?
Tại sao loại f2 không phải là number -> Bool? Những gì có thể so sánh khác có thể f2 chấp nhận?

Trả lời

6

Thông thường khi bạn thấy biến kiểu trong một loại trong Elm, biến này không bị giới hạn. Khi bạn cung cấp một loại cụ thể, biến được thay thế bằng loại cụ thể đó:

-- 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 là biến kiểu có ý nghĩa đặc biệt. Nghĩa là nó sẽ chỉ khớp với các loại "có thể so sánh", như Int, String và một vài loại khác. Nhưng nếu không nó sẽ hành xử giống nhau.Vì vậy, tôi nghĩ rằng đó là một chút lỗi trong hệ thống kiểu, cho rằng bạn nhận được:

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

    comparable 

    String 

Nếu lỗi là không có, bạn sẽ nhận được:

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

    Int 

    String 

EDIT: Tôi mở một issue cho lỗi này

+0

Cảm ơn. Tôi thấy Evan đã xác định nó là một lỗi. – z5h

+0

Có, tôi sẽ chỉnh sửa chỉnh sửa của mình :) – Apanatshka

1

Tôi nghĩ câu hỏi này có thể liên quan đến this one. IntString đều là comparable theo nghĩa là chuỗi có thể được so sánh với chuỗi và int có thể được so sánh với int. Một hàm có thể lấy bất kỳ hai phép so sánh nào sẽ có một chữ ký comparable -> comparable -> ... nhưng trong bất kỳ một đánh giá nào của hàm cả hai phép so sánh phải có cùng loại.

Tôi tin rằng lý do f2 là khó hiểu trên là 1 là một number thay vì một loại bê tông (mà dường như để ngăn chặn sự biên dịch từ nhận thức rằng có thể so sánh phải có một loại nhất định, có lẽ nên được cố định). Nếu bạn đã làm:

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

bạn sẽ thấy nó thực sự không sụp đổ comparable để đúng loại khi nó có thể.

1

lấy từ các tài liệu elm: - here

loại tương đương bao gồm numbers, characters, strings, lists of comparable thingstuples of comparable things. Lưu ý rằng bộ dữ liệu có 7 hoặc nhiều phần tử không thể so sánh được; tại sao tuples của bạn là quá lớn?

Điều này có nghĩa rằng:

[(1,"string"), (2, "another string")]: List (Int, String) - có thể so sánh

Nhưng có

(1, "string", True): (Int, String, Bool) hoặc

[(1,True), (2, False)]: List (Int, Bool) - là không thể so sánh được.

Vấn đề này sẽ được thảo luận here

Lưu ý: Thông thường người gặp vấn đề với các loại comparable khi họ cố gắng sử dụng một loại đoàn như một chính trong một Dict.

Thẻ và Công cụ xây dựng kiểu công đoàn không thể so sánh được. Vì vậy, những điều sau đây thậm chí không biên dịch.

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

Thông thường khi bạn cố gắng để làm điều này, có một cách tiếp cận tốt hơn với cấu trúc dữ liệu của bạn. Nhưng cho đến khi điều này được quyết định - một AllDict có thể được sử dụng.

+1

Có vẻ như bạn đã đọc tiêu đề câu hỏi của tôi chứ không phải là nội dung đầy đủ. Sự nhầm lẫn của tôi tại thời điểm câu hỏi là vì có một lỗi trong trình biên dịch. Câu trả lời được chọn là tham chiếu chính xác lỗi. https://github.com/elm-lang/elm-compiler/issues/1013 – z5h

+0

@ z5h có, bạn có quyền trong lĩnh vực đó. Tuy nhiên, tôi nghĩ rằng câu trả lời của tôi là có liên quan, bởi vì câu hỏi này là điều đầu tiên xuất hiện trong Google - một khi một người mới đến elm cố gắng hiểu những gì 'so sánh' có nghĩa là ***. Câu trả lời của tôi là dành cho họ - bởi vì tôi đã mất 20 phút bản thân mình - để hiểu ** chính xác điều này có thể so sánh được là gì - tôi ngạc nhiên khi thấy rằng 'Bools' không được xem là có thể so sánh được. Câu trả lời được chọn giải thích: "Int, String và một số khác" - không phải là rất cụ thể.Đây là lý do tại sao tôi bao gồm đoạn elm-docs. – AIon

Các vấn đề liên quan