В следующей программе мы знаем, что valStr.value
предполагает подтип pair
родового типа t
. Тем не менее, когда я исследую его в poly
, тип отображается как t
. Есть ли способ, который я могу видеть в интерпретаторе poly
, что t
был специальным для pair
?Просмотр специализации/подтип родовое в polyml после применения функтора
Это то, что я получаю, когда я бегу poly
:
> poly
Poly/ML 5.5.2 Release
> use "forum.ml";
signature PAIR =
sig val coord : pair val getFirst : pair -> real type pair end
structure Pair :
sig
val coord : pair
val getFirst : pair -> real
type pair = real * real
end
signature VALUE = sig type t val value : t end
functor createVal (R : PAIR) : VALUE
val extracted = 1.0: real
val main = fn: unit -> unit
structure valStr : VALUE
val it =(): unit
> valStr.value;
val it = (1.0, 2.0): valStr.t
(* I want to see that it is of type "pair" *)
и код, используемый для его производства является:
(* forum.ml *)
signature PAIR =
sig
type pair
val coord : pair
val getFirst : pair -> real
end
structure Pair =
struct
type pair = real * real
val coord = ((1.0,2.0) : pair)
fun getFirst ((x,y) : pair):real = x
end
signature VALUE =
sig
type t
val value: t
end
functor createVal(R : PAIR) : VALUE =
struct
type t = R.pair
val value = R.coord
end
structure valStr = createVal(Pair)
val extracted = Pair.getFirst valStr.value
fun main() = print (Real.toString extracted)
Но я хочу, чтобы иметь возможность работать **, используя интерпретатор **, что такое тип 'valStr.value', не зная его типа a-priori. Если, используя ваше предложение, я ввел неправильный тип 'valStr.value: real', я просто получаю' Static Errors'. Разве не возможно было бы получить вывод полима ** все ** возможный предполагаемый тип вместо «Статических ошибок»? Спасибо – artella
Только что я понял, что могу сделать «val temp: real = valStr.value;», и он дает полезное сообщение об ошибке 'Причина: Невозможно объединить реальные в реальные * реальные (Несовместимые типы)', которые говорят мне, что 'valStr.value 'имеет тип' real * real' – artella