После редактирования: Ваша проблема связана с отступом. Вам нужно добавить хотя бы один пробел перед show w = ...
, иначе он станет определением верхнего уровня внутри модуля Company, в результате чего будет два отдельных определения show
, одно из которых не перегружено, а не часть instance Show Man
определение.
Перед редактированием: Ваш код не выполняется из-за отсутствующих частей, но при добавлении этих отсутствующих частей он также не выдает предупреждения, которые вы выводите:
module Main where
import Data.List
data Title = Manager | Dev | Tester deriving (Show)
data Man = Man { _age :: Int
, _name :: String
, _title :: Title
, _income :: Int
}
instance Show Man where
show m = intercalate "," (zipWith (\name acc -> name ++ ":" ++ acc m) names accessors)
data Company = Company { _cname :: String
, _people :: [Man]
, _yf :: Int
}
instance Show Company where
show (Company cname people yf) =
intercalate "\n " $
("Company (" ++ cname ++ ", " ++ show yf ++ "):") : map show people
names :: [String]
names = ["age", "name", "title", "income"]
accessors :: [Man -> String]
accessors = [show . _age, show . _name, show . _title, show . _income]
main :: IO ()
main = do
print alice
print bob
print (Company "Alice & Bob's" [alice, bob] 1)
alice, bob :: Man
alice = Man 41 "Alice" Manager 41000
bob = Man 42 "Bob" Manager 42000
Дает:
$ ./show
age:41,name:"Alice",title:Manager,income:41000
age:42,name:"Bob",title:Manager,income:42000
Company (Alice & Bob's, 1):
age:41,name:"Alice",title:Manager,income:41000
age:42,name:"Bob",title:Manager,income:42000
Хотя вы, вероятно, были бы вполне довольны deriving (Show)
для каждого из них.