我正在尝试使用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 (===)
如果有人能帮助我解决这个问题,我将非常感激。
答案 0 :(得分:3)
有几个问题。
GADTs
或TypeFamilies
语言扩展来使用类型相等约束(提及~
的那些)。您的语法不是很正确:(===) emptyBlock (===)
正试图将两个"图表" emptyBlock
和(===)
彼此之上。由于(===)
不是图表,而是形成图表的函数,因此它不会飞行。你应该写
x ==== y = x === emptyBlock === y
代替。
您声称(||||)
和(====)
适用于任何并列图表,但其实现包含一个白色矩形,这意味着它必须是可以设置样式,具有轨迹和可以改变。更改类型签名行,如下所示:
(||||), (====) :: (Juxtaposable a, V a ~ R2, Semigroup a, TrailLike a, HasStyle a, Transformable a) => a -> a -> a
(或者,如果您打算禁用单态限制,可能会完全省略它。)
emptyBlock
一个类型签名,它是类型多态的,所以单态限制开始了。给它一个类型签名,或者通过启用{{1来关闭单态限制语言扩展。实施这四项更改将产生以下完整文件:
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