2010-10-01 32 views
5

Thỉnh thoảng tôi thấy mình đang tích hợp mẫu "nếu Bool không sai" hoặc "nếu danh sách không trống, hãy sử dụng nó, nếu không thì hãy sử dụng cái gì khác"."có thể" giống như chức năng cho Bool và Danh sách?

Tôi đang tìm các hàm cho Bool và Danh sách là chức năng "có thể" là Có thể. Có cái gì không?

Cập nhật: Tôi muốn sử dụng trường hợp Bool làm tổng quát hóa trường hợp Danh sách. Ví dụ: khi làm việc với Data.Text là T:

if T.null x then x else foo x 

Tôi đang tìm cách giảm mã tấm nồi hơi như vậy.

+1

Vui lòng cung cấp một ví dụ về chức năng đó cho Bool ... – kennytm

Trả lời

4

Tôi nghĩ câu trả lời có thể là không có chức năng chung như vậy. Như djv nói, bạn có thể có thể xây dựng trên Data.Monoid để viết một cái gì đó, giống như:

maybe' :: (Eq a, Monoid a) => b -> (a -> b) -> a -> b 
maybe' repl f x = if x == mempty then repl else f x 

Nhưng tôi không biết bất kỳ chức năng nào trong thư viện chuẩn như thế làm như vậy).

3

Kiểm tra Data.Monoid, đó là một kiểu chữ mô tả các kiểu dữ liệu có giá trị rỗng được chỉ định và bạn có thể khớp mẫu trên đó để viết hàm chung của mình. Có các trường hợp cho Bool với giá trị trống False và cho List với giá trị trống [].

6

có thể là sự biến hình của loại Có thể.

foldr là sự biến hình của loại danh sách.

Nếu bạn đã sử dụng có thể như: maybe x (const y)

Bạn có thể sử dụng: foldr (const (const y)) x

Đối Bool Tôi cũng bỏ lỡ catamorphism trong thư viện chuẩn, nhưng nó sẽ là:

bool :: a -> a -> Bool -> a 
bool t _ True = t 
bool _ f False = f 
+2

Chức năng ['bool'] (http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Bool.html#v:bool) tồn tại trong các gói gần đây của gói 'base'. –

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