2011-01-02 39 views
6

Tôi đã cố gắng sử dụng bản ghi cập nhật cho bản ghi tồn tại khi tôi gặp lỗi. Một google nhanh chóng dẫn tôi đến feature request #2595, cho thấy nó như được thực hiện cho GHC trở lại trong phiên bản 6.8.3. Tôi đang sử dụng 6.10.4, vì vậy tôi nghĩ rằng nó sẽ làm việc, nhưng mã ví dụ từ các yêu cầu tính năng:Haskell: Bản cập nhật cho các loại tồn tại

{-# LANGUAGE ExistentialQuantification,Rank2Types #-} 
module Foo where 

data Foo = forall a . Foo { foo :: a -> a, bar :: Int } 

x :: Foo 
x = Foo { foo = id, bar = 3 } 

f :: Foo -> Foo 
f rec = rec { foo = id } 

g :: Foo -> Foo 
g rec = rec { bar = 3 } 

mang lại các lỗi tương tự như phàn nàn về trong yêu cầu tính năng:

test.hs:10:8: 
    Record update for the non-Haskell-98 data type `Foo' is not (yet) supported 
    Use pattern-matching instead 
    In the expression: rec {foo = id} 
    In the definition of `f': f rec = rec {foo = id} 

test.hs:13:8: 
    Record update for the non-Haskell-98 data type `Foo' is not (yet) supported 
    Use pattern-matching instead 
    In the expression: rec {bar = 3} 
    In the definition of `g': g rec = rec {bar = 3} 

Đây có phải là tính năng giảm ý thức tại một thời điểm nào đó hay tôi nên gửi báo cáo lỗi?

Trả lời

5

Thực tế, phiếu Trac cho biết đã được triển khai trong phiên bản 6.12 - lỗi là được tìm thấy trong phiên bản 6.8.3. Vì vậy, bạn đang sử dụng một phiên bản cũ hơn bản sửa lỗi.

Ngoài ra, mục nhập thay đổi cho sửa chữa dường như cho biết rằng nó không hoàn toàn cố định; bạn vẫn nhận được lỗi đầu tiên, không phải là lỗi thứ hai. Nếu chưa có báo cáo lỗi cho phần còn lại của sự cố, tôi sẽ nói tiếp tục và gửi.

+2

Ah. Cảm ơn bạn đã tiết kiệm cho tôi khi tạo ra một sai lầm ngớ ngẩn bằng cách cho rằng nó phải được sửa trong phiên bản của tôi. Tắt để đi cập nhật GHC! – rampion

+0

Ah, thông báo lỗi mới và khác, giống như bạn đã nói. Nhưng một người nghĩ rằng tôi đang làm điều gì đó sai, không phải là điều đó là không thể. – rampion

3

Vẫn còn một cách khác!


Nếu bạn thay đổi định nghĩa kiểu dữ liệu từ

data Foo = forall a . Foo { foo :: a -> a, bar :: Int } 

để

data Foo = Foo { foo :: forall a . a -> a, bar :: Int } 

, sau đó nó biên dịch mà không có lỗi. - sử dụng ghc-6.12.2.20100531

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