2015-08-30 10 views
2

В следующей программе мы знаем, что 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) 

ответ

3

Вы можете добавить ограничение типа:

> valStr.value: Pair.pair; 
val it = (1.0, 2.0): Pair.pair 

Poly/ML пытается напечатать тип полезным способом, но он не может догадаться, что будет наиболее полезным в любой конкретный случай, когда имеется несколько эквивалентных типов.

+0

Но я хочу, чтобы иметь возможность работать **, используя интерпретатор **, что такое тип 'valStr.value', не зная его типа a-priori. Если, используя ваше предложение, я ввел неправильный тип 'valStr.value: real', я просто получаю' Static Errors'. Разве не возможно было бы получить вывод полима ** все ** возможный предполагаемый тип вместо «Статических ошибок»? Спасибо – artella

+1

Только что я понял, что могу сделать «val temp: real = valStr.value;», и он дает полезное сообщение об ошибке 'Причина: Невозможно объединить реальные в реальные * реальные (Несовместимые типы)', которые говорят мне, что 'valStr.value 'имеет тип' real * real' – artella