2011-08-27 24 views
7

Tôi biết tôi có thể thường chỉ mô hình phù hợp, nhưng đôi khi tôi sẽ tìm thấy những chức năng hữu ích:Tôi có thể hỏi một Cho dù đó là Trái (hay Phải)?

isLeft = either (const True) (const False) 
isRight = either (const False) (const True) 

Có một cái gì đó như thế trong thư viện chuẩn?

+0

Tôi nghĩ rằng @ pyrospade phải là câu trả lời được chấp nhận ngay bây giờ. – SwiftsNamesake

Trả lời

19

Trong khi điều này khá cũ, hãy đăng ở đây để tham khảo.

này bây giờ là trong thư viện chuẩn dưới Data.Either từ 4.7:

https://hackage.haskell.org/package/base-4.7.0.0/docs/Data-Either.html

isLeft :: Either a b -> Bool

Return True nếu giá trị nhất định là một trái giá trị, False khác.

isRight :: Either a b -> Bool

Return True nếu giá trị nhất định là một giá trị Đúng, sai khác.

3

Không, không có, afaik.

Nhưng bạn có thể xác định các chức năng này thậm chí còn dễ dàng hơn *:

isLeft (Left _) = True 
isLeft _  = False 

cùng đi cho isRight, tất nhiên.

EDIT: * Được rồi, tôi đoán đó là đáng tranh cãi nếu đó là dễ dàng hơn hay không, vì nó đòi hỏi nhiều dòng mã ...

5

Không, nhưng bạn có thể viết:

import Data.Either 

isLeft = null . rights . return 
isRight = null . lefts . return 
+2

Có lẽ vì đó là một cách khá đơn giản để xác định các chức năng. Một định nghĩa về 'hoặc' hoặc sử dụng kết hợp mẫu có lẽ sẽ dễ hiểu hơn. –

+0

Có thể.Tôi hơi thất vọng về một vài chức năng có sẵn cho 'Either', không có nhiều việc để làm. Tôi sẽ ít nhất mong đợi một cái gì đó như 'leftMaybe :: Hoặc là một b -> Có thể a' và đối tác của nó. – Landei

2

As far as Tôi biết, không có gì giống như thế này trong thư viện chuẩn. Tuy nhiên, bạn có thể tự xác định nó một cách dễ dàng.

either l _ (Left a) = l a 
either _ r (Right b) = r b 

isLeft (Left _) = True 
isLeft _  = False 

isRight (Right _) = True 
isRight _   = False 
+2

OP muốn biết liệu 'isLeft' và' isRight' có nằm trong thư viện chuẩn dưới các tên khác nhau hay không. Anh ta biết anh ta đã có thể định nghĩa chúng về 'hoặc', mà * là * trong thư viện chuẩn. – dave4420

+3

Tôi đã +1 mục này vì các câu trả lời tương tự không có -1. Ông _did_ cũng trả lời câu hỏi. – alternative

13

Vì mọi người đã chỉ ra, không có chức năng như vậy trong thư viện chuẩn và bạn có thể triển khai thực hiện theo nhiều cách khác nhau.

Tuy nhiên, lưu ý rằng các câu hỏi của biểu mẫu "Có phải X trong thư viện chuẩn không?" được một cách dễ dàng nhất đã trả lời bởi Hoogle, vì ngay cả khi bạn không biết tên của một hàm, bạn có thể tìm kiếm nó bằng cách của nó loại.

Hoogle cũng đủ thông minh để biết rằng thứ tự đối số không quan trọng và cũng sẽ hiển thị kết quả có loại tương tự (ví dụ: chung chung hơn) so với loại bạn đã tìm kiếm.

Trong trường hợp này, hãy tìm kiếm Either a b -> Booldoes not yield any promising matches, vì vậy đó là một chỉ báo tốt cho thấy nó không tồn tại trong thư viện chuẩn.

+1

Lời khuyên cho Hoogle vẫn tốt, nhưng lưu ý rằng thư viện chuẩn * hiện * có chức năng như vậy ngay bây giờ; xem [câu trả lời khác cho câu hỏi này] (http://stackoverflow.com/a/24046158/1126841). – chepner

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