2013-02-09 33 views
6

Được cung cấp một chuỗi các chữ số, tôi muốn có một chuỗi các tuple ánh xạ các ký tự khác 0 với vị trí của chúng trong chuỗi. Ví dụ:Có chức năng thư viện hoặc toán tử nào để tạo một bộ tuple không?

IN: "000140201" 
OUT: { (3, '1'); (4, '4'); (6, '2'); (8, '1') } 

Giải pháp:

let tuples = source 
      |> Seq.mapi (fun i -> fun c -> (i, c)) 
      |> Seq.filter (snd >> (<>) '0') 

Nó có vẻ như (fun i -> fun c -> (i, c)) là rất nhiều đánh máy hơn so với nó nên được cho một thao tác đơn giản và có lẽ phổ biến như vậy. Thật dễ dàng để khai báo các chức năng cần thiết:

let makeTuple a b = (a, b) 
let tuples2 = source 
       |> Seq.mapi makeTuple 
       |> Seq.filter (snd >> (<>) '0') 

Nhưng có vẻ như với tôi rằng nếu thư viện cung cấp các snd chức năng, nó cũng nên cung cấp các makeTuple chức năng (và có lẽ với một tên ngắn hơn), hoặc ít nhất là nó nên tương đối dễ soạn. Tôi không thể tìm thấy nó; tui bỏ lỡ điều gì vậy? Tôi đã cố gắng để xây dựng một cái gì đó với Tuple.Create của khung công tác, nhưng tôi không thể tìm ra cách để có được bất cứ thứ gì khác ngoài sự quá tải một đối số.

+5

Cải tiến nhỏ 'Seq.mapi (vui vẻ ab -> a, b)' –

+0

@JohnPalmer ah, cảm ơn.Tôi nghĩ rằng tôi đã có một lỗi với cú pháp đó trước đó, nhưng tôi cho rằng lỗi đã được gây ra bởi cái gì khác. – phoog

+1

Ngoài ra, '||>' là đảo ngược của toán tử mà bạn muốn. –

Trả lời

7

Nhưng dường như với tôi rằng nếu thư viện cung cấp hàm snd, nó cũng phải cung cấp hàm makeTuple.

F # giả định rằng bạn phân tách các bộ dữ liệu (sử dụng fst, snd) thường xuyên hơn so với soạn chúng. Thiết kế thư viện chức năng thường tuân theo nguyên tắc tối thiểu. Chỉ cần cung cấp các chức năng cho các trường hợp sử dụng phổ biến, các chức năng khác nên dễ xác định.

Tôi không thể tìm thấy; tui bỏ lỡ điều gì vậy?

Không, bạn không. Đó là lý do mà FSharpx đã xác định tuple2, tuple3, vv Đây là chức năng tiện ích trực tiếp từ Prelude:

/// Creates a pair 
let inline tuple2 a b = a,b 
/// Creates a 3-tuple 
let inline tuple3 a b c = a,b,c 
/// Creates a 4-tuple 
let inline tuple4 a b c d = a,b,c,d 
/// Creates a 5-tuple 
let inline tuple5 a b c d e = a,b,c,d,e 
/// Creates a 6-tuple 
let inline tuple6 a b c d e f = a,b,c,d,e,f 

Tôi cố gắng để xây dựng một cái gì đó với Tuple.Create của khuôn khổ, nhưng tôi không thể tìm ra làm thế nào để có được bất cứ điều gì khác hơn là quá tải đối số đơn.

F # trình biên dịch ẩn thuộc tính của System.Tuple<'T1, 'T2> để thực thi thành phần khớp mẫu trên bộ dữ liệu. Xem Extension methods for F# tuples để biết thêm chi tiết.

Điều đó nói rằng, kiểu điểm không phải lúc nào cũng được đề xuất trong F #. Nếu bạn thích không có điểm, bạn phải tự mình nâng cấp nặng.

2

Câu trả lời của @ pad của là rất tốt, chỉ để thêm 2 cent của tôi: Tôi đang sử dụng nhà điều hành tương tự

let inline (-&-) a b = (a, b) 

và có vẻ rất thuận tiện để viết let x = a -&- b

Có lẽ bạn sẽ tìm thấy điều hành này hữu ích quá

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