2017-05-28 19 views
6

Tôi đã nhìn thấy mã này biên dịch mà không có lỗi và tôi không thể nói nếu là một lỗi hoặc nếu dự kiến ​​của nó.Chỉ định loại tham số không được trình biên dịch thực thi - đây có phải là lỗi hoặc được mong đợi không?

type alias Foo = List 
vs 
type alias Foo = List String 

và không chỉ với List. Các loại công đoàn tùy chỉnh cũng được cho phép. Ví dụ:

type State value = Valid value | Invalid value 

type alias Model1 = 
    { someField : State String } -- i would say this is normal. State is a string.. 

type alias Model2 = 
    { someField : State } -- this doesn't look right. 

và cũng có chức năng được phép

function1 : List String -> Int 
function1 aListOfStrings = 
    1 

function2 : List -> Int 
function2 whatisThisNow = 
    1 

Nhưng nếu được mong đợi - cách lập luận về nó? Tôi không thể quấn quanh đầu mình. Chơi với nó here.

+0

Ví dụ đầu tiên có vẻ ổn với tôi: nó sẽ cho phép thực hiện một phần ứng dụng loại chức năng. Nhưng hai người khác thực sự trông giống như một cái gì đó mà nên được hạn chế (vì không có giá trị mà loại là một loại chức năng). –

+0

Điều này có vẻ khó hiểu. Bạn có thể sẽ nhận được nhiều phản hồi hơn nếu bạn hỏi về Slack mặc dù: http://elmlang.herokuapp.com/ – hkgumbs

Trả lời

1

Cái nhìn đầu tiên được chấp nhận. Việc xác định type alias Foo = List sẽ cho phép bạn sử dụng Foo thay vì List. Nhưng nó không biên dịch (với Elm 0,18):

type alias Foo = List 

names : Foo String --does not compile 
names = ["a", "b"] 

Có vẻ như loại bí danh không được kiểm tra đầy đủ khi khai báo, vì vậy có thể tạo bí danh loại không thể sử dụng được.

Ví dụ đầu tiên, trình biên dịch có thể được sửa để hỗ trợ đúng cách. Ví dụ thứ hai nên là một lỗi thời gian biên dịch mặc dù, bởi vì không có cách nào để có được một giá trị của loại List (hoặc State). Haskellers sẽ nói List (hoặc State) có loại * -> *, nhưng giá trị tại thời gian chạy chỉ có thể có loại *.

Tôi đoán bạn tìm thấy một lỗi trong phiên bản Elm hiện tại (0,18)


Điều thú vị là, thay đổi mã ở trên để

type alias Foo a = List a 

names : Foo String 
names = ["a", "b"] 
-- compiles with Elm 0.18 

làm cho nó hoạt động một cách chính xác .. Hai đoạn mã nên tương đương.

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