haskell - 暧昧的出现秀
问题描述
当我尝试创建一个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
公司.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)
PS添加了我刚刚在 Prelude 中加载的所有模块。错误是show
应用在 all 上accesors
。
解决方案
编辑后:您的问题是由于缩进。前面至少要加一个空格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)
的每一个感到非常满意。
推荐阅读
- tcp -
- 无效的加载键,ZMQ socket.recv_pyobj() 中的 '\x00' - apache-spark - 如何在 spark sql 中使用数据透视函数
- reactjs - 模拟点击反应中的第一个节点
- python - 是否可以在 x 轴(经度)上移动 geopandas 世界地图?
- oracle - 如何使用 Ref 游标作为 Visual Basic 的 Out-parameter 调用 Oracle 函数
- c# - 如何判断 Unity 构建过程中出了什么问题?
- windows - 用于浏览器的 Powershell 更改
- visual-studio-code - Windows vscode python extension install autopep8 failed: can't open file问题
- javascript - 如何循环遍历随机数并停在某个数字处?Javascript
- r - 如何使用基础 R 和 ggplot 绘制逻辑回归模型的结果