Chúng ta có thể sử dụng chuỗi cặp để tạo danh sách heterogenous trong Haskell:Haskell: lọc danh sách heterogenous theo loại
type a *: b = (a, b)
a *: b = (a, b)
infixr 5 *:
hlist :: Int *: String *: Maybe Float *:()
hlist = 1 *: "hello" *: Just 3 *:() -- (1, ("hello", (Just 3,())))
Có cách nào chúng ta có thể làm lọc loại cấp trên các danh sách này? Đó là, xác định một số chức năng đa hình hfilter
như vậy với nhiều loại khác nhau a
, b
và c
:
hfilter :: a *: b *: c *: a *: b *: a *:() -> a *: a *: a *:()
hfilter :: a *: b *: c *: a *: b *: a *:() -> b *: b *:()
hfilter :: a *: b *: c *: a *: b *: a *:() -> c *:()
hfilter :: a *: b *: c *: a *: b *: a *:() -> ()
Xin lỗi về vấn đề biên dịch, tôi đã đăng bài từ điện thoại của mình. – rampion
Ok, tôi đã có thể nhận được từ này để [một phiên bản mà không yêu cầu 'OverlappingInstances' bằng cách đi qua một đối số lọc] (https://gist.github.com/1885439)' hfilter :: a -> h - > h'' và sử dụng danh sách không đồng nhất cho đầu ra. Vì vậy, hfilter (undefined :: Int) hlist ::() 'là'() ',' hfilter (undefined :: Int) hlist :: Int: *() 'là' 1: *() 'và' hfilter (undefined :: Int) hlist :: Int: * Int: *() 'là' 1: * 2: *() '. – rampion
arg, nhưng điều đó đòi hỏi 'OverlappingInstances' để thực sự sử dụng. – rampion