2011-01-31 27 views
26

Tôi mới dùng Haskell, xin lỗi nếu đây là câu hỏi cơ bản.Haskell: Kiểm tra xem Int có nằm trong danh sách của Int

Tôi hiện đang có danh sách Int và tôi đang cố gắng tạo hàm có biến x và trả về boolean tùy thuộc vào biến có tồn tại trong danh sách hay không.

Tôi đã tìm kiếm và tìm thấy hàm Data.List find nhưng hàm này dường như trả về một boolean.

Tôi đang sử dụng GHCi.

Xin cảm ơn,

Trả lời

67

Trước tiên hãy tìm loại chức năng bạn cần.

Để "Kiểm tra xem" có nghĩa là trả về True hoặc False, một Bool.

Vì vậy, các chức năng phải mất một Int, một danh sách các Int (aka [Int]) và trả về Bool:

Int -> [Int] -> Bool 

Bây giờ ask hoogle.

elem :: Eq a => a -> [a] -> Bool 

Hoogle là một công cụ rất hữu ích. Bạn có thể integrate it with ghci.

+5

Yêu cầu Google dẫn tôi tới đây. Bạn không cần phải khắc nghiệt với OP. – fotanus

+6

Làm cách nào để cải thiện giai điệu của câu trả lời? Tôi đã không cố gắng để được khắc nghiệt. – AtnNn

+10

xấu của tôi, tôi đọc "yêu cầu google" :-D – fotanus

15

Nếu chức năng chuẩn elem không tồn tại, bạn có thể đã đi đúng hướng với find.

myElem :: (Eq a) => a -> [a] -> Bool 
myElem x = maybe False (const True) . find (== x) 

Có rất nhiều cách khác để thực hiện nó quá, giống như

myElem x = any (== x) 
myElem x = or . map (== x) 
myElem x = not . null . filter (== x) 
myElem x = foldr (\y b -> y == x || b) False 

, vv

0

tôi đã làm nó đơn giản hơn như thế này.

l=[1,2,3,4,5] 


checkIfElem :: Int -> [Int] ->Bool 
checkIfElem x l 
     |x`elem` l =True 
     |otherwise=False 
+12

Điều đó thực sự đơn giản, nhưng người ta cũng có thể nói đó là một cách cực kỳ phức tạp để viết định nghĩa 'checkIfElem = elem', bởi vì nó tương đương với _exactly_! (Các lính canh đã kiểm tra các giá trị boolean, '| condition = True'' | else = False' do đó tương đương với '= condition'. Điều này khiến bạn với' checkIfElem xl = elem xl', trong đó bằng η-reduce bạn có thể thả các đối số ở cả hai bên.) – leftaroundabout

+0

Tôi không nghĩ điều này đơn giản. –

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