2013-05-15 3 views

ответ

5
type SinglePP a = (String, a) 

, а затем, когда вы используете SinglePP в функции, ограничить a быть GLattice

someFunc :: GLattice a => SinglePP a ->() 
someFunc a = doMagic a 

Если вы хотите, вы можете использовать больше типа системы-Foo и идти с экзистенциальными типами, которые позволяют вы избегаете шаблона после каждой функции, но взамен вы должны использовать расширение языка и объявление data с явным конструктором. Это означает большее совпадение шаблонов, если вы хотите получить на a, но меньше набираете объявления типов.

Однако большинство типов можно вывести.

+0

Что делать, если я хочу представлять SinglePP в списке, например. Я хочу сделать что-то вроде: type ProgramPoints = [SinglePP] –

+0

Я получил его работу, спасибо –

3

использовать расширение ExistentialQuantification, например, так:

{-# LANGUAGE ExistentialQuantification #-} 

class GLattice l where 
    join :: l -> l -> l 

data SinglePP = forall a . (GLattice a) => SinglePP String a 

Это гарантирует, что значение, сохраненное в SinglePP «s второго поля имеет тип, который реализует GLattice класса, но не определяет, какой типа. Это означает, что вы сможете использовать только операции GLattice.

+0

Это похоже на слишком много для тех, кто, похоже, испытывает проблемы с базовым синтаксисом Haskell. Экзистенциалы могут приводить к случаям с нечетным краем. – jozefg

+0

о том, когда я хочу получить контент от SinglePP, например. что-то вроде getVarFromPP: :(GLattice a) => SinglePP -> a, его не работает, если я использую шаблон matche –

Смежные вопросы