2016-06-27 3 views
11

Я ищу способ упростить шаблоны функций, когда фактические данные не требуется:Haskell запись шаблон

data X = A | B String | C Int Int String 
myfn :: X -> Int 
myfn A = 50 
myfn (B _) = 200 
myfn (C _ _ _) = 500 

Есть ли способ, чтобы сделать простой шаблон для соответствия C, просто отбрасывая значения ?

hsdev добавляет подсказку «Подсказка: используйте образцы записей», но Google не помог мне там.

ответ

28

Вы можете использовать запись шаблоны, как это:

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 

Это только добавляет функциональности.

+0

Отлично, спасибо. Я действительно пробовал C {_} и C {..}, безрезультатно. Просто один персонаж слишком много. ^^ – theduke

+2

Позор, что Google не очень помогает вам с «шаблоном записи haskell». Я переименовал вопрос, возможно, это сделает его более доступным для других. – theduke

+0

@ theduke: обратите внимание, что вы можете использовать пустой шаблон записи ('B {}'), даже если вы объявили 'B' нормальным, не записываемым типом данных. – Lii

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