Re: Преобразование композитных типов в ocaml
От: vshabanov http://vshabanov-ru.blogspot.com
Дата: 04.06.07 18:59
Оценка:
G>Как в Окамл реализовать конверсию кортежа в список, в массив, в запись?
G>Записи в массив, в кортеж итп. ?

G>Средствами самого ОКамла это вроде бы невозможно?

G>Расширения на Си?

По честному, это невозможно. Однако, учитывая, что массивы, записи и кортежи хранятся внутри окемла одинаково, то можно их грязно преобразовывать при помощи Obj.magic. Только за любые дальнейшие беды (в основном связанные со сборкой мусора и дальнейшим падением программы) разработчики окемла уже не отвечают.

Примеры из серии "никогда не повторяйте этого дома":
# (Obj.magic (1,2,3,4,5) : int array);;
- : int array = [|1; 2; 3; 4; 5|]

# Array.length (Obj.magic (1, 'a', "bcd", [2;3]));:
- : int = 4 (* к массиву лучше не приводить ;) *)

# type 'a l = {hd:'a; tl:'a l};;
type 'a l = { hd : 'a; tl : 'a l; }
# (Obj.magic {hd=1; tl={hd=2; tl=Obj.magic 0}} : int list);;
- : int list = [1; 2]


Повторюсь, делать этого официально нельзя. Хавьер Лерой сказал: "мы не принимаем баг-репорты с программами, использующими модуль Obj".

G>Кстати в SML, оказывается, операция индексирования кортежа есть, но в ОКамл похоже не попала .

G>Опять же, как и задача вызова curryied функции со списком аргументов, в Java это решаемо при помощи Reflection API.
G>Кстати очень хотелось бы чего либо подобного для OCaml.

Никогда в окемле не будет рефлекшна. Окемл не хранит информацию о типах в рантайме. Иначе, зачем тогда статическая типизация.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.