Показ неоднозначности - PullRequest
0 голосов
/ 05 июля 2018

Когда я пытаюсь создать instance класса типов Show, я получаю подсвеченные места, где я использовал show со следующим сообщением:

Ambiguous occurrence `show'
    It could refer to either `Prelude.show',
                             imported from `Prelude' at [..]\Company.hs   (and originally defined in `GHC.Show')
                          or `Company.show',
                             defined at [..]\Company.hs:29:5

Company.hs

module Company where
    import Data.List

    data Worker=Worker{
        age::Int,
        name::String,
        title::Title,
        income::Int
    } 


    names=["age","name","title","income"]
    accesors=[show . age,show . name, show . title,show .income]

    data Title=Manager | Dev | Tester deriving (Show)

    data Company=Company{
        cname::String,
        people::[Man],
        yf::Int
    }deriving (Show)

    instance Show Man where 
    show w = intercalate "," (zipWith (\name acc->name++":"++acc w) names accesors)

P.S Добавлены все модули, которые я только что загрузил в Prelude. Ошибка при show, примененном ко всем accesors.

1 Ответ

0 голосов
/ 05 июля 2018

После редактирования: Ваша проблема связана с отступом. Вам нужно добавить хотя бы один пробел перед 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) для каждого из них.

...