Я знаю, что есть fst
и snd
, но почему нет "общего" определения для таких функций доступа с использованием классов типов? Я бы предложил что-то вроде
class Get1 p a | p -> a where
get1 :: p -> a
instance Get1 (a,b) a where
get1 (x,_) = x
instance Get1 (a,b,c) a where
get1 (x,_,_) = x
class Get2 p a | p -> a where
get2 :: p -> a
instance Get2 (a,b) b where
get2 (_,x) = x
instance Get2 (a,b,c) b where
get2 (_,x,_) = x
Конечно, для этого вам нужны некоторые языковые расширения, но разве это не намного удобнее? Особенно вы можете добавлять экземпляры для своих собственных типов.