Я читал газету о servant
-api DSL (см PDF here)Каковы нелинейные модели
Цитируя Раздела 5.2 типобезопасен Links (подчеркивает, добавленный мной)
type family ElSymbol e (s :: Symbol) a :: Bool where ElSymbol (s :> e) s a = Elem e a ElSymbol e s a = False
Обратите внимание, что типы семейств в GHC - в отличие от нормальных определений функций - разрешают нелинейные узоры, а двойное вхождение
s
на lef t стороны первого случая подразумевают, что оба символа должны быть равны.
Что такое нелинейные узоры в haskell?
Тот факт, что оба вхождения s
должны быть равны, ясно, что это следствие ScopedTypeVariables
-прагма.
Я знаю линейные/нелинейные функции только из контекста математики, где y = kx + d
является (одномерной) линейной функцией и что-то вроде y = x² sin(x)
будет примером для нелинейной функции.
Я предполагаю, что нелинейность исходит из конструктора типа (цитирую из Раздел 3.3 Типы являются гражданами первого класса)
data (item :: k) :> api infixr 9 :>
, но я не могу понять, что делает это не- линейный, и что будет примером линейного конструктора, если мое предположение верно, что конструктор вводит нелинейность.
Я не уверен, но я думаю, что это просто говорит о том, что шаблон будет соответствовать только тем, что символы, которые используются несколько раз в местах, действительно одинаковы - в вашем * нормальном * шаблоне, соответствующем чему-то вроде '(a, a) 'не в порядке - вам нужно добавить guard '(a, b) | a == b' – Carsten
в приведенном выше случае означает, что действительно * pattern * будет соответствовать 'ElSymbol (S:> E) SA', но не' ElSymbol (S:> E) TA' - то, что я не знаю, если 'S ~ T' будет хорошо здесь – Carsten
См. также [здесь] (http://stackoverflow.com/questions/12084593/implying-equality-in-a-haskell-pattern-match), в частности первый комментарий в вопрос. – Bakuriu