2016-06-29 21 views
5

Nói rằng tôi có hồ sơ này:mẫu phù hợp với trên hai hồ sơ với các lĩnh vực cùng

type alias Rec = { a : Int } 

Và, ví dụ, một chức năng mà phải mất hai trong số những điều này và tổng số nguyên của họ.

f: Rec -> Rec -> Int 

này có thể được thực hiện sử dụng accessors kỷ lục (ví dụ: f x y = x.a + y.a), nhưng là có một cách để sử dụng mô hình phù hợp để trích xuất tất cả các số nguyên?

Rõ ràng, hai người không làm việc vì họ sẽ được ràng buộc hai con số khác nhau để biến giống nhau:

f {a} {a} = a + a 

f x y = case (x, y) of ({a}, {a}) -> a + a 

Trả lời

3

Không có cách nào để làm điều này hiện nay. Có mô hình răng cưa (as) nhưng nó chỉ hoạt động cho một mô hình tổng thể, vì vậy đây là không hợp lệ:

type alias Rec = { a : Int } 

f: Rec -> Rec -> Int 
f { a as xa } { a as ya } = xa + ya 

main = f { a = 1 } { a = 2 } 

kết quả trong:

Detected errors in 1 module. 


-- SYNTAX PROBLEM -------------------------------------------------------------- 

I ran into something unexpected when parsing your code! 

4| f { a as xa } { a as ya } = xa + ya 
     ^
I am looking for one of the following things: 

    a closing bracket '}' 
    whitespace 
4

Có vẻ là không có cách nào như vậy trong ngôn ngữ Elm hiện tại . Trong các ngôn ngữ chức năng khác như ML và Haskell, bạn có thể viết mẫu bên trong hồ sơ như:

$ sml 
Standard ML of New Jersey v110.74 [built: Sat Oct 6 00:59:36 2012] 
- fun func {field=x} {field=y} = x+y ; 
val func = fn : {field:int} -> {field:int} -> int 
- func {field=123} {field=45} ; 
val it = 168 : int 

Bạn cũng có thể tạo ra một yêu cầu tính năng cho nhà phát triển (s) của Elm - hoặc đặt một câu hỏi trong community mailing list tại ít nhất.

P.S. Sau khi tìm kiếm nhanh, tôi đã tìm thấy một số proposal để thêm mẫu giống như ML khớp với các trường ghi trong Elm, nhưng dường như đã bị từ chối. :-(

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