2015-02-11 15 views
21

Tôi đang quan sát một hành vi thú vị khi sử dụng mô hình kết hợp với bảo vệ mô hình và tất cả các cảnh báo bậtCảnh báo rằng mô hình bảo vệ là không đầy đủ mặc dù nó là

{-# OPTIONS_GHC -Wall #-} 
module Mood where 

data Mood = Happy 
      | Indifferent 
      | Sad 
      deriving Show 

flipMood :: Mood -> Mood 
flipMood Happy  = Sad 
flipMood Indifferent = Indifferent 
flipMood Sad   = Happy 

flipMood' :: Mood -> Mood 
flipMood' mood 
    | Happy  <- mood = Sad 
    | Indifferent <- mood = Indifferent 
    | Sad   <- mood = Happy 

Mặc dù flipMoodflipMood' đang làm khá nhiều cùng một điều tôi nhận được thông báo lỗi sau:

Mood.hs:15:1: Warning: 
    Pattern match(es) are non-exhaustive 
    In an equation for ‘flipMood'’: Patterns not matched: _ 
Ok, modules loaded: Mood. 

và do đó cần phải thêm một nắm bắt tất cả các trường hợp như thế

| otherwise = mood 

để đáp ứng bộ kiểm tra mức độ đầy đủ.

Lõi có vẻ là chỉ tốt với hai chức năng hành xử giống nhau:

flipMood = 
    \ ds_dTh -> 
    case ds_dTh of _ { 
     Happy -> Sad; 
     Indifferent -> Indifferent; 
     Sad -> Happy 
    } 

flipMood' = flipMood 

Với việc tối ưu tắt Tôi nhận được đầu ra cốt lõi sau đây mà dường như để giải thích hành vi này:

flipMood' = 
    \ mood_axV -> 
    case mood_axV of wild_X9 { 
     __DEFAULT -> 
     case wild_X9 of _ { 
      Indifferent -> Indifferent; 
      Sad -> Happy 
     }; 
     Happy -> Sad 
    } 

Tại sao nó có hoạt động theo cách này không? Tui bỏ lỡ điều gì vậy?

Kind regards, raichoo

Trả lời

26

Có một dài 10 tuổi ticket về điều đó. Về cơ bản: kiểm tra toàn diện trong ghc đang chờ người anh hùng.

Đã thêm: Sự cố đã được đóng hôm nay. Tôi vừa kiểm tra, mã không tạo ra cảnh báo không đầy đủ nữa. Hy vọng rằng nó sẽ là một phần của ghc-8.0.

+0

Tôi đoán điều này giải thích mọi thứ :) – raichoo

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