2015-08-30 11 views
8

Tôi đang sử dụng gói FSharpx.Collections khá phổ biến và đặc biệt là loại NonEmptyList.Xác định toán tử cons (: :) cho bộ sưu tập tùy chỉnh

loại này cung cấp các chức năng NonEmptyList.cons, nhưng tôi muốn sử dụng các nhà điều hành :: như với bình thường List, ví dụ: head :: tail. Vì tail phải là NonEmptyList<'a>, không nên có bất kỳ xung đột nào với nhà điều hành :: của List.

Tuy nhiên, có vẻ như tôi không thể xác định toán tử. Đây:

let (::) h t = NonEmptyList.cons h t 

kết quả trong một lỗi biên dịch:

Unexpected symbol '::' in pattern. Expected ')' or other token. 

Tôi biết rằng :: không phải là khá trong cùng chuyên mục như nhà khai thác khác, nhưng tôi không hoàn toàn hiểu được cách. Vì vậy, tôi đã thử một vài điều ít nhiều ngẫu nhiên, chẳng hạn như thay thế :: bằng op_cons và tương tự, mà không thành công.

Tôi có thiếu thứ gì đó không và có cách nào để làm những gì tôi muốn làm không?

Trả lời

8

According to MSDN, dấu hai chấm không thể thực sự được sử dụng trong tên toán tử. Điều này có vẻ mâu thuẫn với the F# specification từ FSharp.org, tôi không chắc những gì đang xảy ra ở đó. Nhưng chúng ta có thể xác minh rằng trong FSI:

> let (>:>) a b = a+b 
Script.fsx(1,7): error FS0035: This construct is deprecated: ':' is not permitted as a character in operator names and is reserved for future use 

Nếu bạn nhìn vào how List<'T> is defined, bạn sẽ thấy rằng (::) không thực sự là một nhà điều hành, nhưng một constructor trường hợp:

type List<'T> = 
    | ([]) 
    | (::) of Head: 'T * Tail: 'T list 

Và đủ chắc chắn , bạn có thể xác định loại DU của riêng mình với tên là tên nhà xây dựng:

> type A = 
> | (::) of string * int 
> | A of int 
> 
> let a = "abc" :: 5 

val a : A = Cons ("abc",5) 

Bây giờ, kỳ lạ, nếu tôi cố gắng sử dụng toán tử khác -ish-tìm tên như trường hợp nhà xây dựng, tôi nhận được lỗi này:

> type A = | (|>) of string * int 
Script.fsx(1,14): error FS0053: Discriminated union cases and exception labels must be uppercase identifiers 

Có nghĩa là (::) là bằng cách nào đó đặc biệt (và như vậy là ([]), bằng cách này).

Vì vậy, dòng dưới cùng có vẻ là - không, bạn không thể làm điều đó.
Nhưng tại sao bạn thậm chí cần? Bạn có thể, có lẽ, giải quyết cho một tên nhà điều hành chấp nhận được hơn, mà vẫn sẽ thể hiện ngữ nghĩa của "const" - như, nói, (<+>)?

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