【发布时间】:2016-03-09 12:30:23
【问题描述】:
我正在阅读有关 servant-api DSL 的论文(请参阅 pdf here)
引用第 5.2 节键入安全链接(强调由我添加)
type family ElSymbol e (s :: Symbol) a :: Bool where ElSymbol (s :> e) s a = Elem e a ElSymbol e s a = False请注意,GHC 中的类型族——与普通函数定义不同—— 允许非线性模式,并且
s在左侧出现两次 第一种情况的手边意味着两个符号必须相等。
haskell 中的非线性模式是什么?
s 的两次出现需要相等的事实很明显这是ScopedTypeVariables-pragma 的结果。
我仅从数学上下文中了解线性/非线性函数,其中 y = kx + d 是(一维)线性函数,而 y = x² sin(x) 之类的东西将是非线性函数的示例。
我猜非线性来自于类型构造函数(引用自第 3.3 节类型是一等公民)
data (item :: k) :> api infixr 9 :>
但我不太明白是什么造成了这种非线性,以及线性构造函数的示例,如果我的猜测是正确的,构造函数正在引入非线性。
【问题讨论】:
-
我不确定,但我认为它只是说只有在多个地方使用的符号确实相同时,该模式才会匹配 - 在您的 normal 模式中- 匹配
(a,a)之类的东西是不行的 - 你需要添加一个守卫(a,b) | a == b -
在上面的情况下,这意味着确实 pattern 将匹配
ElSymbol (S :> E) S A但不匹配ElSymbol (S :> E) T A- 我不知道S ~ T是否会很好这里 -
另见here,尤其是问题下的第一条评论。
标签: haskell type-families