2010-09-16 27 views
15

Tôi lý tưởng muốn viết một cái gì đó như thế này:Haskell mô hình kết hợp - làm thế nào để sử dụng hằng biến

 
myValue1 = 1 :: Int 
myValue2 = 2 :: Int 

myFunc :: Int -> Bool 
myFunc myValue1 = True 
myFunc myValue2 = False 

Calling myFunc myValue2 lợi nhuận True - không phải những gì tôi dự định. Tôi biết lý do tại sao điều này xảy ra, nhưng có cách nào để diễn đạt điều này trong Haskell mà không cần phải báo cáo theo kiểu C #define C không?

+0

Cảm ơn tất cả mọi người, cho những phản ứng cực kỳ nhanh chóng! – Kevin

Trả lời

22

Vâng, Haskell không thống nhất tên như thế này. Các định danh 'myValue1' và '2' mới là các biến mới mà bạn đang ràng buộc.

Các Haskelly cách mà hầu hết là sử dụng các loại mạnh mẽ và khớp mẫu:

data Values 
    = D1 
    | D2 

myFunc :: Values -> Bool 
myFunc D1 = True 
myFunc D2 = False 

Đem lại cho bạn một sự bảo đảm tĩnh chỉ "1" hoặc "2" có thể được truyền cho MyFunc, phù hợp mang tính biểu tượng thích hợp và thậm chí bạn giữ lại chuyển đổi sang số nguyên bằng cách lấy Enum.

+0

Cảm ơn, điều này dường như là gần nhất với những gì tôi muốn làm - Tôi đã không nghĩ đến việc phát sinh Enum, mà sẽ chỉ là vé. – Kevin

6

Nếu bạn không muốn tạo ra một kiểu dữ liệu, các giải pháp thông thường là sử dụng bảo vệ:

myValue1 = 1 :: Int 
myValue2 = 2 :: Int 

myFunc :: Int -> Bool 
myFunc val | val == myValue1 = True 
      | val == myValue2 = False 

gì bạn đặt sau khi các đường ống có thể được bất kỳ điều kiện boolean; nếu nó đúng, thì phần thân hàm tương ứng sẽ được chạy.

12

Bạn không thể đối sánh với các giá trị biến như Don đã giải thích.

Nhưng bạn có thể sử dụng bảo vệ trong trường hợp này:

myValue1 = 1 :: Int 
myValue2 = 2 :: Int 

myFunc :: Int -> Bool 
myFunc x 
    | x == myValue1 = True 
    | x == myValue2 = False 
1

Nếu ý tưởng chỉ là để xác định một số hằng số để sử dụng trong mô hình, bạn cũng có thể sử dụng phần mở rộng ngôn ngữ PatternSynonyms:

{-# LANGUAGE PatternSynonyms #-} 

pattern MyValue1 = 1 
pattern MyValue2 = 2 

myFunc :: Int -> Bool 
myFunc MyValue1 = True 
myFunc MyValue2 = False 
Các vấn đề liên quan