Мои примеры здесь используют GHCI 8.4.4 с приглашением, "λ: "
.
Я думаю, что вывод из Enum
имеет наибольшее значение, поскольку наиболее фундаментальные типы в Haskell также происходят от Enum
(кортежи, символы, целые числа и т. Д.), И он имеет встроенные методы для получения значений в и из перечисления.
Сначала создайте тип данных, производный Enum
(и Show
, чтобы вы могли просмотреть значение в REPL и Eq
для включения ..
завершения диапазона):
λ: data MyDataType = Foo | Bar | Baz deriving (Enum, Show, Eq)
λ: [Foo ..]
[Foo,Bar,Baz]
Перечисления определяют метод, fromEnum
, который можно использовать для получения значений, запрошенных в вопросе (0
, 1
и 2
).
Использование:
λ: map fromEnum [Foo ..]
[0,1,2]
Этопростое определение функции, дающей произвольное значение (например, степени двойки с использованием целочисленного оператора мощности, ^
):
λ: value e = 2 ^ (fromEnum e)
Использование:
λ: map value [Foo ..]
[1,2,4]
Другой ответ говорит:
Решение deriving Enum
отлично, но оно не будет работать, если вы хотите иметь произвольное отображение на числа.
Хорошо, давайте посмотрим на это (используйте :set +m
, чтобы включить многострочный ввод в GHCI, если вы этого еще не сделали):
arbitrary e = case e of
Foo -> 10
Bar -> 200
Baz -> 3000
Использование:
λ: map arbitrary [Foo ..]
[10,200,3000]
Мытолько что продемонстрировал, что он действительно работает, но я бы предпочел рассчитать его по fromEnum
, как мы это делали с value
, если мы не хотим, чтобы значения увеличивались на 1 с 0.