Haskell Diagrams对齐函数

时间:2014-05-24 21:47:26

标签: haskell haskell-diagrams

我正在尝试使用Haskell Diagrams来创建我自己的函数,它将两个图表水平/垂直放置在彼此之间(如|||或===),但它们之间有一个空格。如果我尝试这样做,我会收到错误:非法等式约束V a~R2

emptyBlock = rect (3) (1) # fc white # lc white
(||||) :: (Juxtaposable a, V a ~ R2, Semigroup a) => a -> a -> a
(||||) = (|||) emptyBlock (|||)
(====) :: (Juxtaposable a, V a ~ R2, Semigroup a) => a -> a -> a
(====) = (===) emptyBlock (===)

如果有人能帮助我解决这个问题,我将非常感激。

1 个答案:

答案 0 :(得分:3)

有几个问题。

  1. 正如您的代码所说的错误所说,您需要启用GADTsTypeFamilies语言扩展来使用类型相等约束(提及~的那些)。
  2. 您的语法不是很正确:(===) emptyBlock (===)正试图将两个"图表" emptyBlock(===)彼此之上。由于(===)不是图表,而是形成图表的函数,因此它不会飞行。你应该写

    x ==== y = x === emptyBlock === y
    

    代替。

  3. 您声称(||||)(====)适用于任何并列图表,但其实现包含一个白色矩形,这意味着它必须是可以设置样式,具有轨迹和可以改变。更改类型签名行,如下所示:

    (||||), (====) :: (Juxtaposable a, V a ~ R2, Semigroup a, TrailLike a, HasStyle a, Transformable a) => a -> a -> a
    

    (或者,如果您打算禁用单态限制,可能会完全省略它。)

  4. 你还没有给emptyBlock一个类型签名,它是类型多态的,所以单态限制开始了。给它一个类型签名,或者通过启用{{1来关闭单态限制语言扩展。
  5. 实施这四项更改将产生以下完整文件:

    NoMonomorphismRestriction

    然而,这仍然有一些不足之处:

    • 如果你使用它来分隔顶部不是白色的图表,那么仍然会绘制间隔符,可能会使底层图表的某些部分黯然失色。
    • 矩形在两个维度上延伸,这意味着如果使用此方法水平对齐比间距更短的图表或垂直对齐的图表比间隔更窄,则生成的复合材料将包含不正确的包络。

    您可以使用{-# LANGUAGE NoMonomorphismRestriction, TypeFamilies #-} import Diagrams.TwoD import Data.Colour.Names import Diagrams.Attributes import Diagrams.Core import Diagrams.Util import Data.Semigroup import Diagrams.TrailLike emptyBlock = rect 3 1 # fc white # lc white (||||), (====) :: (Juxtaposable a, V a ~ R2, Semigroup a, TrailLike a, HasStyle a, Transformable a) => a -> a -> a x |||| y = x ||| emptyBlock ||| y x ==== y = x === emptyBlock === y strutX代替strutY修复这两件事。这也将更加通用:您不需要包含奇怪的可设置/可变形约束。这种方法的一个例子是:

    emptyBlock