2015-03-18 19 views
14

Data xác định là một trong những chức năng cốt lõi của nó gfoldl:Hiểu loại chữ ký của gfoldl từ Data.Data.Data

gfoldl 
    :: (Data a) 
    => (forall d b. Data d => c (d -> b) -> d -> c b) 
    -> (forall g. g -> c g) 
    -> a 
    -> c a 

mục đích c là gì và c (d -> b) trong nó? Tại sao không phải là nó chỉ là một lần bình thường, giống như

gfoldl' 
    :: (Data a) 
    => (forall d. Data d => r -> d -> r) 
    -> r 
    -> a 
    -> r 

Trả lời

13

Ý tưởng là một giá trị của một kiểu dữ liệu đại số trong Haskell có dạng

C x_1 x_2 ... x_n 

nơi C là một constructor và x_i là các đối số. Có gì

gfoldl app con 

làm là để biến một giá trị đó vào

con C `app` x_1 `app` x_2 ... `app` x_n 

qua đó biến một a thành một c a. Giả sử các loại C

C :: T_1 -> T_2 -> ... -> T_n -> D 

sau đó chúng ta hãy nhìn vào các loại biểu thức trung gian:

con C         :: c (T_1 -> T_2 -> ... -> T_n -> D) 
con C `app` x_1       :: c (T_2 -> ... -> T_n -> D) 
con C `app` x_1 `app` x_2    :: c (... -> T_n -> D) 
con C `app` x_1 `app` x_2 ... `app` x_n :: c D 

Các tham số hóa trên c cho phép tất cả các loại trung gian là khác nhau. Nếu chúng tôi sử dụng một lần đơn giản như gfoldl' thay vào đó, thì tất cả các loại trung gian này sẽ phải giống nhau.

Động lực cho gfoldl là một tổng quan đơn lẻ cho phép bạn thể hiện các chức năng SYB gmapQgmapT (và một vài loại khác). Các loại gmapQgmapT là:

gmapQ :: Data a => (forall d. Data d => d -> u) -> a -> [u] 
gmapT :: Data a => (forall b. Data b => b -> b) -> a -> a 

Trong khi gmapQ sụp đổ một a vào một danh sách thống nhất u s và có thể được thể hiện bằng gfoldl', điều này sẽ không thể thực hiện cho gmapT.

Tuy nhiên, với gfoldl, chúng ta có thể sử dụng c = Identity để giúp chúng ta có được cái gì đó như gmapTc = Const để có được một cái gì đó giống như gmapQ.

Để biết thêm chi tiết, bạn cũng có thể muốn nhìn vào giấy Scrap your boilerplate Reloaded đó cho thấy rằng gfoldl là một bình thường (chưa bậc cao) gấp của một kiểu dữ liệu đó được gọi là Spine trong bài báo đó.

Việc sử dụng danh tính và hàm số liên tục để có được cả chuyển đổi và cập nhật hành vi từ một biểu diễn cơ bản duy nhất có số tương tự như cách bạn có được hoạt động của ống kính từ ống kính "van Laarhoven".

+0

"tham số hóa trên' c' cho phép tất cả các loại trung gian này khác nhau "- bạn có thể xây dựng? Điều đó không thực sự có ý nghĩa rõ ràng. – leftaroundabout

+0

@leftaroundabout Trong 'gfoldl'' tất cả các lần xuất hiện' x X' là 'r', tức là tất cả chúng đều phải là cùng loại. Với 'c X', tôi vẫn có thể có tất cả chúng cùng kiểu, chẳng hạn như trong' Const r X', đó là đẳng cấu đối với 'r'. Nhưng tôi cũng có thể có tất cả chúng khác nhau, ví dụ như trong 'Identity X' là isomorphic thành' X'. – kosmikus

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