Khi sử dụng các loại Existential, chúng ta phải sử dụng cú pháp khớp mẫu để trích xuất giá trị ed forall
. Chúng tôi không thể sử dụng bộ chọn bản ghi thông thường làm chức năng. GHC báo cáo lỗi và đề nghị sử dụng mô hình khớp với định nghĩa này của yALL
:Tại sao tôi không thể sử dụng bộ chọn bản ghi với loại định lượng hiện có?
{-# LANGUAGE ExistentialQuantification #-}
data ALL = forall a. Show a => ALL { theA :: a }
-- data ok
xALL :: ALL -> String
xALL (ALL a) = show a
-- pattern matching ok
-- ABOVE: heaven
-- BELOW: hell
yALL :: ALL -> String
yALL all = show $ theA all
-- record selector failed
forall.hs:11:19:
Cannot use record selector `theA' as a function due to escaped type variables
Probable fix: use pattern-matching syntax instead
In the second argument of `($)', namely `theA all'
In the expression: show $ theA all
In an equation for `yALL': yALL all = show $ theA all
Một số dữ liệu của tôi mất hơn 5 yếu tố. Thật khó để duy trì mã nếu tôi sử dụng mô hình khớp:
func1 (BigData _ _ _ _ elemx _ _) = func2 elemx
Có một phương pháp tốt để làm cho mã như vậy duy trì hoặc để quấn nó lên để tôi có thể sử dụng một số loại selectors?
Gợi ý: Loại 'theA' là gì? –
@Louis Wasserman: bạn có nghĩa là sử dụng cú pháp tồn tại trong yALL không? làm sao? – Nybble
Về cơ bản, câu trả lời là nó _doesn't_ có một loại rõ ràng, vì vậy bạn cần khớp mẫu để có được một loại khả thi. –