我正在配置xmonad,因为我必须启动几个dzen实例,所以我认为最好使用一个函数来获取x和y位置,宽度,高度和文本对齐的参数:
-- mydzen.hs
import Data.List
-- | Return a string that launches dzen with the given configuration.
myDzen :: Num a => a -> a -> a -> Char -> String -> String
myDzen y x w ta e =
intercalate " "
[ "dzen2"
, "-x" , show x
, "-w" , show w
, "-y" , show y
, "-h" , myHeight
, "-fn" , quote myFont
, "-bg" , quote myDBGColor
, "-fg" , quote myFFGColor
, "-ta" , [ta]
, "-e" , quote e
]
quote :: String -> String
quote x = "'" x "'"
-- dummy values
myHeigth = "20"
myFont = "bitstream"
myDBGColor = "#ffffff"
myFFGColor = "#000000"
Could not deduce (Show a) arising from a use of `show'
from the context (Num a)
bound by the type signature for
myDzen :: Num a => a -> a -> a -> Char -> String -> String
at mydzen.hs:(5,1)-(17,13)
Possible fix:
add (Show a) to the context of
the type signature for
myDzen :: Num a => a -> a -> a -> Char -> String -> String
In the expression: show x
In the second argument of `intercalate', namely
`["dzen2", "-x", show x, "-w", ....]'
In the expression:
intercalate " " ["dzen2", "-x", show x, "-w", ....]
显然,删除签名或更改Num a
Show a
可以解决问题,但我无法理解原因。 '参数'x
,w
和y
假设几乎是任何类型的数字(100
,550.2
, 1366 * 0.7
ecc)。
我是haskell的新手,直到现在我还没能(明确地)理解错误或发现错误。
答案 0 :(得分:16)
以前,Show
和Eq
是Num
的超类,代码会编译。
在新的GHC中,从版本7.4开始,这已经发生变化,现在Num
不依赖于Show
和Eq
,因此您需要将它们添加到签名中。
原因是关注点分离 - 有数字类型没有明智的相等和显示功能(可计算的实数,函数环)。
答案 1 :(得分:6)
并非所有数字都可以显示(Int
或Integer
等标准类型,但您可以定义自己的类型;编译器将如何知道?)您正在使用show x
您的函数 - 因此,a
必须属于Show
类型类。您可以将签名更改为myDzen :: (Num a, Show a) => a -> a -> a -> Char -> String -> String
并删除错误。
答案 2 :(得分:3)
show
不是Num
类型类的一部分 - 为了能够使用它,您必须在Show
一起添加Num
约束:
myDzen :: (Num a, Show a) => a -> a -> a -> Char -> String -> String