LINUX.ORG.RU

[haskell][ADT] Извлечение парметра из конструктора

 


0

1
data Type = Constructor String

f1 :: String -> Type
f1 = Constructor

f2 :: String
f2 = case f1 "123" of Constructor a -> a

Как это сделать без использования case?

Кстати, а есть какая-то возможность читать документацию к модулям в консоли на манер man'ов или perldoc'а?

★★★★★
data Type = Constructor String
selector (Constructor s) = s

f1 :: String -> Type
f1 = Constructor

f2 :: String
f2 = selector f1

не? вообще-то с алгебраическими типами только сопоставлением с образцом и можно работать.

http://en.wikipedia.org/wiki/Algebraic_data_type

korvin_ ★★★★★
()

Как это сделать без использования case?

Зачем?

Кстати, а есть какая-то возможность читать документацию к модулям в консоли на манер man'ов или perldoc'а?

lynx? Не выпендривайтесь, товарищ Рабинович.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Miguel

Зачем?

case с одной веткой — это странно, да и громоздко. Второй ветки у меня нет и быть не может так как конструктор у меня один. Как вариант можно использовать вторым образцом _ (и соответственно во-второй ветке вызывать error), но тогда компилятор ругается на overlapping образцов. Уже разобрал этот вопрос с jtootf.

Miguel

lynx? Не выпендривайтесь, товарищ Рабинович.

Не… Я хочу офлайн и желательно в старой доброй разметке man'ов. А что совсем никаких подвижек в эту сторону нет?

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

case с одной веткой — это странно, да и громоздко. Второй ветки у меня нет и быть не может так как конструктор у меня один

Тогда let:

let Constructor s = valueOfType in ...
Begemoth ★★★★★
()
Ответ на: комментарий от KblCb

case с одной веткой — это странно, да и громоздко.

Подсыпать сахарку, тут уже насоветовали вариантов. Хотя, ИМХО, явный case лучше неявного.

А вообще, в хаскеле есть две основных конструкции, на которых все вычисления стоят: применение функции к аргументу, и паттерн-матчинг (то есть, case). Желание обойтись без одной из них - гм... непонятно.

Miguel ★★★★★
()

если совсем не нравится case, то

f2' :: String
f2' = fromConstructor $ f1 "123" where fromConstructor (Constructor a) = a

lelf
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.