Как преобразовать полиморфное значение в строку?

На самом деле я ищу функцию с такой подписью, как 'a -> string, которая преобразует данный полиморфный тип в строку. Я уже думал о чем-то вроде

let func elem = match elem with
| int -> string_of_int elem ...

Надеюсь, кто-нибудь может мне помочь, спасибо!


person J.B.    schedule 12.12.2018    source источник
comment
связанные: stackoverflow.com/q/7518752/124319   -  person coredump    schedule 13.12.2018


Ответы (1)


В OCaml невозможно сопоставить типы, и это функция! Такое ограничение приводит к параметричности.

Проще говоря, если функция f имеет тип 'a -> string, ее тип обещает работать с любыми возможными типами, прошлыми и будущими. Другими словами, функция f не может делать никаких предположений о содержании своего аргумента.

Таким образом, единственная честная возможность - не пытаться ничего прочитать из аргумента и просто вернуть строку, например

 let f _x = "x?"

Возможно, мы можем прочитать некоторые глобальные состояния с помощью функции g

let f _x = g ()

например

let counter = ref 0
let f _x = incr counter; string_of_int !counter
person octachron    schedule 12.12.2018
comment
Кроме того, типы в любом случае не существуют во время выполнения. Но значения могут быть явно помечены информацией о типе с использованием варианта, например. type t = Int of int | String of string, который, конечно же, можно сопоставить. - person glennsl; 13.12.2018