7

我正在配置 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 aforShow a可以解决问题,但我不明白为什么。'arguments' x,w并且应该y是几乎任何类型的数字(, , ecc )。100550.21366 * 0.7

我是 haskell 的新手,直到现在我还无法(清楚地)理解错误或找出问题所在。

4

3 回答 3

18

以前,ShowEq是超类,Num并且代码可以编译。

在新的 GHC 中,从 7.4 版开始,这已经改变,现在Num不依赖于Showand Eq,因此您需要将它们添加到签名中。

原因是关注点分离 - 存在没有合理相等和显示函数的数字类型(可计算实数,函数环)。

于 2012-06-25T18:15:00.587 回答
7

并非所有数字都是可显示的(标准类型如Intor Integerare,但您可以定义自己的类型;编译器怎么知道?)您show x在函数中使用 - 因此,a必须属于Showtypeclass。您可以将签名更改为myDzen :: (Num a, Show a) => a -> a -> a -> Char -> String -> String并消除错误。

于 2012-06-25T16:28:00.537 回答
3

show不是Num类型类的一部分——为了能够使用它,你必须在它Show旁边添加约束Num

myDzen :: (Num a, Show a) => a -> a -> a -> Char -> String -> String
于 2012-06-25T16:28:07.270 回答