2011-11-19 29 views

Trả lời

11

Đơn giản chỉ cần

import Data.Maybe (listToMaybe) 
getA xs = listToMaybe [e | [email protected](A _) <- xs] 

Phụ Lục: thậm chí tốt hơn, tương lai khả năng chống sử dụng một mô hình kỷ lục rỗng (thanh danh Hammar): Tuy nhiên

getA xs = listToMaybe [e | [email protected](A{}) <- xs] 

Lưu ý rằng đây chỉ hoạt động ra để gọn gàng cho các nhà xây dựng phù hợp. Đối với tài sản chung, find là đẹp hơn:

get prop xs = listToMaybe [e | e <- xs, prop e] 
get prop xs = listToMaybe (filter prop xs) 
get prop xs = find prop xs 
+0

Thật tuyệt vời, cảm ơn bạn! – martingw

+0

Tôi thực sự thích cách giải pháp này sử dụng một danh sách hiểu để workaround có để phù hợp với mô hình trên nhiều hơn chỉ là các nhà xây dựng dữ liệu mong muốn. Nó có thể được cải thiện bằng cách sử dụng mẫu bản ghi trống được sử dụng bởi @hammar trong câu trả lời của anh ta. –

+0

@ IonuțG.Stan đồng ý, điều đó sẽ chứng minh tương lai nó. –

3

Bạn có thể sử dụng tìm:

data Elem = A Int | B Char deriving Show 
getA elements = find (\x->case x of (A _) -> True; _ -> False) elements 
+0

Cảm ơn, rất đẹp! Không phải là nhà vô địch golf, mặc dù :-)! – martingw

11

Bạn có thể sử dụng Data.List.find.

getA = find isA 
    where isA (A {}) = True 
     isA _ = False 
+1

Phần '{}' được gọi là gì? Tôi chưa bao giờ thấy nó trước đây trong Haskell. Tôi đoán nó phù hợp với 0 hoặc nhiều lĩnh vực xây dựng dữ liệu? –

+2

@ IonuțG.Stan: Đó là một mẫu _record_ không có kết buộc trường. Nó chỉ có nghĩa là nó không quan trọng bao nhiêu lĩnh vực constructor có, vì vậy nếu bạn thay đổi nó, bạn không cần phải thay đổi chức năng này. – hammar

+0

@hammer Cảm ơn! Chính xác những gì tôi nghĩ là vậy. –

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