Я хочу построить тип Haskell:Haskell построить тип содержит класс
type SinglePP = (String,GLattice)
Где GLattice определяется как:
class GLattice l where
join :: l->l->l
....
Есть ли способ для меня, чтобы сделать это?
Я хочу построить тип Haskell:Haskell построить тип содержит класс
type SinglePP = (String,GLattice)
Где GLattice определяется как:
class GLattice l where
join :: l->l->l
....
Есть ли способ для меня, чтобы сделать это?
type SinglePP a = (String, a)
, а затем, когда вы используете SinglePP
в функции, ограничить a
быть GLattice
someFunc :: GLattice a => SinglePP a ->()
someFunc a = doMagic a
Если вы хотите, вы можете использовать больше типа системы-Foo и идти с экзистенциальными типами, которые позволяют вы избегаете шаблона после каждой функции, но взамен вы должны использовать расширение языка и объявление data
с явным конструктором. Это означает большее совпадение шаблонов, если вы хотите получить на a
, но меньше набираете объявления типов.
Однако большинство типов можно вывести.
использовать расширение ExistentialQuantification
, например, так:
{-# LANGUAGE ExistentialQuantification #-}
class GLattice l where
join :: l -> l -> l
data SinglePP = forall a . (GLattice a) => SinglePP String a
Это гарантирует, что значение, сохраненное в SinglePP
«s второго поля имеет тип, который реализует GLattice
класса, но не определяет, какой типа. Это означает, что вы сможете использовать только операции GLattice
.
Это похоже на слишком много для тех, кто, похоже, испытывает проблемы с базовым синтаксисом Haskell. Экзистенциалы могут приводить к случаям с нечетным краем. – jozefg
о том, когда я хочу получить контент от SinglePP, например. что-то вроде getVarFromPP: :(GLattice a) => SinglePP -> a, его не работает, если я использую шаблон matche –
Что делать, если я хочу представлять SinglePP в списке, например. Я хочу сделать что-то вроде: type ProgramPoints = [SinglePP] –
Я получил его работу, спасибо –