2017-02-23 26 views
6

Tôi đang học Elm và tôi tìm thấy rất nhiều thứ hấp dẫn về nó, chẳng hạn như sự thanh lịch và đơn giản của nó. Tuy nhiên, một khía cạnh mà tôi thấy khó hiểu là việc sử dụng "++" để nối chuỗi. Ví dụ:Tại sao Elm sử dụng toán tử '++' để nối chuỗi?

> "hello" ++ " world" 
"hello world" 

Tính năng bổ sung hoạt động theo cách bạn mong đợi.

> 2 + 3 + 9 
14 

Đa số các ngôn ngữ cấp cao như C#/Java/JavaScript/Python sử dụng một dấu cộng "+" trong chuỗi nối theo cách tương tự với nhiều số sẽ được tổng hợp. Nó có vẻ trực quan hơn nhiều, vì có một sự nhất quán nhất định trong việc nối chuỗi như tổng số.

Có ai biết logic đằng sau quyết định thiết kế sử dụng ++ thay vì + trong ngữ cảnh này không?

Trả lời

9

Elm cho phép bạn xác định các chức năng đa hình.

polymorphism Parametric là khi một chức năng có thể được áp dụng cho các yếu tố của bất kỳ loại:

f : (a, b) -> (b, a) 
f (x, y) = (y, x) 

Ad-hoc đa hình là khi một chức năng có thể được áp dụng cho các yếu tố của một số loại:

g : appendable -> appendable -> appendable -> appendable 
g x y z = x ++ y ++ z 

h : number -> number -> number 
h x y = (x + 2) * y 

Các biến kiểu numberappendable là đặc biệt bởi vì chúng đại diện cho một tập con của tất cả các loại Elm. ListStringappendable loại trong khi FloatInt là các loại số.

Nó về mặt lý thuyết có thể là có thể thay vì định nghĩa một biến hasPlus loại trong đó sẽ bao gồm List, String, FloatInt, nhưng sau đó khi xác định một chức năng đa hình, bạn sẽ cần phải nhận thức được rằng nó có thể là x + y khác với y + x và đó sẽ là một gánh nặng nếu bạn đang thực sự suy nghĩ về các con số ...

6

Điều này có thể tránh tình trạng quá tải người vận hành. Có thể hữu ích khi suy luận kiểu tĩnh hoặc thậm chí cải thiện khả năng đọc khi các biến được sử dụng, vì nó sau đó rõ ràng những gì đang được thực hiện (chuỗi nối nếu ++ hoặc arithmetics nếu +).

Trong ngôn ngữ không được nhập mạnh (Tôi không biết nếu đây là trường hợp trong ELM), sử dụng cùng một ký hiệu có thể làm cho nó không thể biết những gì đang được thực hiện trên các biến trước khi thực sự chạy chương trình, mà làm cho nó chậm hơn.

XQuery sử dụng || thay vì + quá, một số ngôn ngữ thậm chí sử dụng ký hiệu khác nhau cho số thập phân, như +. trong CAML.

+0

Cảm ơn câu trả lời của bạn. Nó chắc chắn có vẻ hợp lý. Tôi đang tìm kiếm một câu trả lời dứt khoát trực tuyến từ Evan Czaplicki hoặc một người nào đó thuộc về các hoạt động bên trong của ELM và không thể tìm thấy câu trả lời. Do đó câu hỏi của tôi. –

+0

Một số ngôn ngữ chính khác không quá tải '+' để nối là PHP (sử dụng '.') và ANSI SQL (sử dụng' || '). –

+1

@DaveS Nếu những gì bạn muốn là câu trả lời từ người trong cuộc, bạn nên hỏi về danh sách gửi thư dev. –

4

Theo docs, các nhà điều hành ++ được sử dụng cho các danh sách phụ thêm:

-- alias for appending lists and two lists 
append xs ys = xs ++ ys 
xs = [1,2,3] 
ys = [4,5,6] 

-- All of the following expressions are equivalent: 
a1 = append xs ys 
a2 = xs ++ ys 

b2 = (++) xs ys 

c1 = (append xs) ys 
c2 = ((++) xs) ys 

Trước khi phiên bản 0.9, chuỗi được biểu diễn dưới dạng một danh sách Haskell lấy cảm hứng từ các nhân vật. Phiên bản 0.9 đã giới thiệu một thư viện chuỗi mới (xem announcement ở đây), vì vậy có vẻ như toán tử ++ vẫn tồn tại mặc dù các chuỗi không còn được biểu diễn dưới dạng danh sách nữa.

+0

Từ tài liệu ngôn ngữ Elm Core - "Elm sử dụng toán tử (++) để đặt chuỗi lại với nhau. Chú ý rằng cả hai chuỗi được bảo toàn chính xác như khi chúng được đặt lại với nhau để kết hợp" hello "và" world " không có khoảng trắng." Những gì bạn nói có thể rất tốt. Tôi muốn thấy một câu trả lời dứt khoát. Tôi cho đến nay đã không thể tìm thấy một, do đó câu hỏi của tôi. –

+0

Có phải ++ chỉ giới hạn trong các Danh sách và Chuỗi phụ thêm? –

+0

[Dường như vậy] (http://package.elm-lang.org/packages/elm-lang/core/5.1.1/Basics#++). – CodeMacabre

5

Kết hợp và bổ sung là các hoạt động hoàn toàn khác với các thuộc tính khác nhau. Ví dụ, bổ sung là giao hoán (trên số nguyên, phao nổi là những con thú khác nhau), trong khi nối chắc chắn nhất là không. Quyết định tùy ý để tái sử dụng các toán tử bởi một số ngôn ngữ là kết nối mạnh nhất giữa chúng mà bạn có thể tìm thấy.

Và ngay cả khi quá tải có ý nghĩa, bạn sẽ nhấn bản chất tĩnh của ngôn ngữ - loại nhà khai thác như vậy nên là loại nào?

Hiện nay các nhà điều hành hoạt động trên ma thuật loại number:

(+) : number -> number -> number 

Trong khi bạn có thể có một loại ma thuật mới numberorstring+ chức năng sẽ là đa hình với hai ngữ nghĩa khác nhau, điều này sẽ chỉ được giới thiệu nhiều hơn ma thuật vào ngôn ngữ.

+0

Chính xác của bạn, tôi không chính xác trong phần cuối của câu hỏi của tôi; tức là tôi đã chuyển ngôn ngữ của mình thành ghép nối. Tôi đã sửa lỗi đó. Cảm ơn đã chỉ ra điều đó. –

+0

Bạn hơi sai, có một kết nối. (Chuỗi, ++) và (Danh sách, ++) là các monoids, trong khi ví dụ: (Int, +) là một nhóm abelian. Nhưng bất kỳ nhóm nào cũng là một monoid. Nhưng kết nối là quá yếu IMO là hữu ích trong trường hợp của Elm. –

+0

Tôi đoán đây là một phần của lý do mặc dù [về nguyên tắc có thể xác định bổ sung không giao hoán trên các vòng tổng quát] (https://en.wikipedia.org/wiki/Near-semiring) (không nói đến giới hạn- số điểm nổi chính xác mà bạn đã đề cập). Trong cùng một tĩnh mạch, tôi chắc chắn có một số hình thức toán học sẽ cho phép chúng tôi xác định liên tục như là một loại bổ sung. –

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