Вы можете использовать запись шаблоны, как это:
data X = A | B {name :: String} | C {x::Int, y::Int, name::String}
myfn :: X -> Int
myfn A = 50
myfn B{} = 200
myfn C{} = 500
модель запись позволяет давать имена полем конструкторов. вы также можете сделать что-то вроде:
myfn C{name=n} = length n
так что вы можете видеть, что вы можете сопоставить шаблон только на конкретном поле вам нужно.
Примечание: вы можете использовать запись шаблон пустой даже с типами данных, которые не используют синтаксис записи:
data A = A Int | B Int Int
myfn A{} = 1
myfn B{} = 2
Это нормально. Там ряд других расширений, связанных с рекордными моделями:
RecordWildCards
позволяет писать такие вещи, как C{..}
, которая эквивалентна схему: C{x=x, y=y, name=name}
, то есть они соответствуют всем полям и теперь у вас есть в рамках x
с значение соответствует для x
поля и т.д.
NamedFieldPuns
позволяет писать C{name}
эквивалентным C{name=name}
, так что name
в настоящее время в объеме и содержит значение согласованного для name
поле.
Имейте в виде, что использование записи паттернов не мешает вам использовать ваши конструктор в позиционном пути, так что вы все еще можете написать:
myfn (B _) = 200
Это только добавляет функциональности.
Отлично, спасибо. Я действительно пробовал C {_} и C {..}, безрезультатно. Просто один персонаж слишком много. ^^ – theduke
Позор, что Google не очень помогает вам с «шаблоном записи haskell». Я переименовал вопрос, возможно, это сделает его более доступным для других. – theduke
@ theduke: обратите внимание, что вы можете использовать пустой шаблон записи ('B {}'), даже если вы объявили 'B' нормальным, не записываемым типом данных. – Lii