В качестве альтернативы другим предложениям вы можете определить Point3D как запись:
data Point3D = Point3D { x :: Int, y :: Int, z :: Int }
instance Show Point3D where
show (Point3D x y z) = concat ["<", show x, ",", show y, ",", show z, ">"]
Или вы помещаете трипель в новый тип:
data Point3D = Point3D (Int, Int, Int)
instance Show Point3D where
show (Point3D (x,y,z)) = concat ["<",(show x),",",show y,",",show z,">"]
См. http://learnyouahaskell.com/making-our-own-types-and-typeclasses за и против этих версий.
[Изменить]
Я узнал, что лучше написать последнюю версию как
newtype Point3D = Point3D (Int, Int, Int)
instance Show Point3D where
show (Point3D (x,y,z)) = concat ["<",(show x),",",show y,",",show z,">"]
Ключевое слово newtype
было создано именно для такой ситуации. Преимущество перед data
заключается в том, что компилятору не нужно «оборачивать» базовый тип, но он может сохранять его как внутреннее представление, которое и быстрее, и «ленивее».