2013-04-21 42 views
6

Giả sử tôi có mã (sai) sau.Haskell Lỗi mã không thể truy cập?

data A a b where 
    APure :: (A a b) 
    AApply :: A (A b c) c 

test :: (A a b) -> a -> b 
test (APure) a = a 
test AApply a = undefined 

GHC sau đó sẽ cho tôi lỗi này:

Couldn't match type `b' with `A b1 b' 
    `b' is a rigid type variable bound by 
     the type signature for test :: A a b -> a -> b 
Inaccessible code in 
    a pattern with constructor 
    AApply :: forall c b. A (A b c) c, 
    in an equation for `test' 
In the pattern: AApply 
In an equation for `test': test AApply a = undefined 

Không phải là thông báo lỗi này hoàn toàn sai? Lỗi này không liên quan gì đến AApply.

+1

Làm thế nào để 'AApply' được cho là có kiểu chung' A a b' nếu bạn khai báo nó là 'A (A b c) c' rồi? Nó giống như khi bạn định nghĩa 'concat ':: [a] -> [b]' như 'concat' = concat': Haskell sẽ hợp nhất' a' "xuống" thành '[b]' ?. – leftaroundabout

+1

Có, nó không trực quan. Có lẽ bạn nên [nộp một lỗi] (http://hackage.haskell.org/trac/ghc/newticket?type=bug). –

+0

@leftaroundabout Tôi không thực sự hiểu những gì bạn có ý nghĩa, nhưng trường hợp đó là entierlly chính xác. Đọc trên patternmatching với GADTs. – nulvinge

Trả lời

4

Isn't this error message completely wrong? The error has nothing to do with AApply .

Không hoàn toàn. Nó được cho là một lỗi mà bạn nhận được thông báo lỗi, nhưng nó không hoàn toàn tắt cơ sở.

Nhìn toàn bộ mọi thứ lại với nhau sau khi xem các phần.

test (APure) a = a 

nói rằng chúng ta có một hàm

test :: A a b -> r -> r 

Đặt rằng cùng với chữ ký

test :: (A a b) -> a -> b 

và thống nhất, bỏ qua những lỗi loại từ phương trình đầu tiên, loại được tinh chế để

test :: A r r -> r -> r 

Sau đó nhìn vào phương trình

test AApply a = undefined 

và xem như thế nào đó là không thể tiếp cận theo loại tinh chế, vì

AApply :: A (A b c) c 

sẽ đòi hỏi

c ~ A b c 

nếu AApply là một cuộc tranh luận đầu tiên hợp lệ.

+0

Tôi nghi ngờ một cái gì đó như thế này đã xảy ra. Tại sao nó hợp nhất thành 'A r r -> r -> r'? Làm thế nào để loại có thể thay đổi thành loại khác khi loại chức năng được chỉ định? – nulvinge

+0

Với GADT, bạn nhận được sàng lọc kiểu. Tôi nghĩ điều xảy ra ở đây là một lỗi trong trình kiểm tra kiểu (và với 6.12.3, bạn nhận được sự ngạc nhiên '' Không thể so sánh kiểu dự kiến ​​'b 'với kiểu được suy ra' a''' cho phương trình đầu tiên, 7.0, 7.2 và 7.4 chỉ đưa ra lỗi cho phương trình thứ hai; 7.6 cả hai) - resp. nhà sản xuất thông báo lỗi, sự tinh tế biến mất. Nó phải dừng lại trên lỗi trong phương trình đầu tiên. Nhưng một khi nó tiếp tục sau đó, nó đã làm việc với những giả thuyết không nhất quán, do đó, nó không phải là quá đáng ngạc nhiên rằng nó kết thúc với một kết quả ngớ ngẩn. –

+0

Ồ, do đó, nó là một lỗi được cố định (nhưng phiên bản GHC của tôi là cũ). Cảm ơn! – nulvinge

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