2012-03-11 28 views
13

Tôi đang cố gắng viết hàm thành phần hàm variadic. Về cơ bản, về cơ bản là (.), ngoại trừ hàm đối số thứ hai là variadic. Điều này sẽ cho phép biểu thức thích:Chức năng soạn thảo biến thể?

map even . zipWith (+) 

hoặc chỉ

map even . zipWith 

Hiện nay những gì tôi đã đạt đến công trình nếu tôi thêm IncoherentInstances và đòi hỏi một trường hợp không đa hình cho hàm số đầu tiên.

{-# LANGUAGE FlexibleInstances, OverlappingInstances, MultiParamTypeClasses, 
FunctionalDependencies, UndecidableInstances, KindSignatures #-} 

class Comp a b c d | c -> d where 
    comp :: (a -> b) -> c -> d 

instance Comp a b (a :: *) (b :: *) where 
    comp f g = f g 

instance Comp c d b e => Comp c d (a -> b) (a -> e) where 
    comp f g = comp f . g 

Mọi ý tưởng? Thậm chí có thể không?

+1

bạn có thể giải thích một chút gì bạn có nghĩa là bởi thành phần "variadic chức năng "? có thể thêm một số ví dụ. –

+0

Tôi đã làm rõ một chút trong bản chỉnh sửa cuối cùng. Bên cạnh đó, có gì sai với hai ví dụ? – is7s

+0

Ồ, xin lỗi. Ví dụ là tốt. Nó không phải là hiển nhiên đối với tôi rằng họ không đánh máy. –

Trả lời

9

Có thể gõ-hack nó vào làm việc với chức năng đa hình:

{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, 
    IncoherentInstances, UndecidableInstances, 
    FunctionalDependencies, TypeFamilies, 
    NoMonomorphismRestriction #-} 


class Comp a b c | a b -> c where 
    (...) :: a -> b -> c 

instance (a ~ c, r ~ b) => Comp (a -> b) c r where 
    f ... g = f g 

instance (Comp (a -> b) d r1, r ~ (c -> r1)) => Comp (a -> b) (c -> d) r where 
    f ... g = \c -> f ... g c 

t1 = map even ... zipWith (+) 
t2 = map even ... zipWith 
t3 = (+1) ... foldr 

Nhưng tôi nghi ngờ bạn có thể tránh IncoherentInstances

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