2008-09-12 30 views

Trả lời

4

bị dội ngược, nhưng tôi tin rằng nó là giá trị để viết ở đây việc triển khai (/-/) (phiên bản F # của Haskell's \\):

let flip f x y = f y x 

let rec delete x = function 
    | [] -> [] 
    | h :: t when x = h -> t 
    | h :: t -> h :: delete x t 

let inline (/-/) xs ys = List.fold (flip delete) xs ys 

Điều này sẽ hoạt động dưới dạng \\ của Haskell, sao cho (xs @ ys) /-/ xs = ys. Ví dụ: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7] đánh giá thành [1; 2; 3; 5; 7; 8; 9; 10; 11].

4

Không ... Chỉ cần viết nó và biến nó thành một toán tử infix - sử dụng bộ ký tự đặc biệt. Dấu gạch chéo ngược (\) không có trong danh sách dưới đây, vì vậy nó sẽ không hoạt động như một toán tử kết xuất. Xem manual:

infix-op: =

or || & && <OP >OP $OP = |OP &OP ^OP :: -OP +OP *OP /OP %OP 

**OP 

prefix-op: =

!OP ?OP ~OP -OP +OP % %% & && 
+4

"// sẽ hoạt động như một toán tử kết xuất". Không nó sẽ không. Đó là nhận xét một dòng trong F #. –

-3

Giả sử bạn thực sự muốn khác biệt thiết lập thông thường chứ không phải là lạ ra lệnh-nhưng -nhiều loại trừ đa số mà Haskell dường như cung cấp, chỉ cần chuyển đổi các danh sách thành các bộ bằng cách sử dụng chức năng được xây dựng trong set và sau đó sử dụng được xây dựng trong - điều hành để tính toán độ lệch thiết lập:

set xs - set ys 

Ví dụ:

> set [1..5] - set [2..4];; 
val it : Set<int> = seq [1; 5] 
+3

Điều này sẽ không xử lý các bản sao chính xác. –

+0

Chỉnh sửa vẫn không xử lý các bản sao chính xác. Toán tử \\ không cung cấp một hành vi thiết lập khác biệt, nó cung cấp một hành vi khác biệt túi. – ScottWest

+0

@Scott: Cảm ơn. Có vẻ như nó không đáng làm một bản dịch trung thành. Tôi nghi ngờ bất cứ ai sẽ bao giờ muốn chức năng đó ... –

1

mục Lọc từ tập các số bị trừ:

let (/-/) xs ys = 
    let ySet = set ys 
    let notInYSet x = not <| Set.contains x ySet 
    List.filter notInYSet xs 
0

Tôi đang sử dụng này:

let (/-/) l1 l2 = List.filter (fun i -> not <| List.exists ((=) i) l2) l1 

Nếu bất cứ ai nhìn thấy một vấn đề, cho tôi biết.

Dành cho các danh sách, do đó có thể có bản sao trong kết quả. Ví dụ:

[1;1;2] /-/ [2;3] would be eq to [1;1] 
Các vấn đề liên quan