Значение в SML, которое имеет конечное число типов n> 1 - PullRequest
1 голос
/ 27 января 2020

Итак, вопрос в том, существует ли для любого целого числа n значение, которое имеет ровно n типов. Для n = 0 и n = 1 ответ должен быть ясным (ноль, много), но что за n> 1?

Ответы [ 2 ]

1 голос
/ 28 января 2020

Для n = 0 и n = 1 ответ должен быть ясным (ноль, много).

Но что за n> 1?

TL; DR: Для некоторого n, да, но не в целом.

Позвольте мне понять, если эти ясные ответы:

  • n = 0: Нет, нет значений, которые относятся к нулевым типам. (Если значение существует, оно должно иметь тип. Значения не существуют в SML, пока не определен их тип.)
  • n = 1: Да, существует значение, которое принадлежит ровно одному типу. (Существует бесконечно много способов, которыми вы можете express значение, принадлежащее ровно одному типу: datatype one = One, datatype two = One | Two, datatype three = One | Two | Three, и в этом случае любой из этих конструкторов значений принадлежит только одному типу в любой одной точке. )

Если это неправильная интерпретация вашего вопроса, не могли бы вы уточнить и уточнить вопрос и эти четкие ответы? Продолжая предположение, что эта интерпретация верна, вот некоторые соображения для n> 1:

Чтобы значение имело несколько типов, оно должно быть polymorphi c. Я могу придумать два пути:

  • Для " ad-ho c полиморфизм " (он же перегрузка): n = K: некоторые ограниченные примеры перегрузки, встроенные операторы, которые имеют несколько типов (например, +, имеющие оба типа int * int -> int и real * real -> real, в зависимости от того, к какому выводу это относится.) Я, честно говоря, точно не знаю, сколько типов перегружено для + типов , но я вижу, что это по крайней мере 3:

    - 1 + 1;
    > val it = 2 : int
    - 1.0 + 1.0;
    > val it = 2.0 : real
    - 0w1 + 0w1;
    > val it = 0wx2 : word
    

    Так что для некоторого произвольного K ≥ 3: Да, op + - это значение, которое имеет ровно K типов.

    Может быть существует несколько перегруженных встроенных значений с различным количеством типов, но поскольку перегруженных встроенных операторов имеется только конечное число, это может быть верно только для очень немногих n> 1 и не для всех n> 1 в general.

    Можно утверждать, что на самом деле это три разных значения op + с одинаковыми именами. Они реализованы по-разному и ведут себя по-разному, поэтому было бы разумно сказать, что они не имеют одинаковое значение, даже если они имеют одно и то же имя. Согласно этой строгой интерпретации, остается только параметри c полиморфизм.

  • Для " параметри c полиморфизм ": значение [] имеет тип 'a list, но также имеет тип int list, real list, bool list и т. Д. Я не знаю, скажете ли вы, что у него бесконечно много типов, но я полагаю, вы могли бы сказать это. Но даже если бы вы сказали это, никакое значение типа 'a something не имело бы конечного числа n> 1 типов. И то же самое не относится к ('a, 'b) something и т. Д.

Я не могу придумать других способов для значения иметь более одного типа в SML, чем эти два вида полиморфизм. Интересный дополнительный вопрос заключается в том, существуют ли значимые способы определения значений в любой системе типов, имеющей n типов, где n> 1, кроме этих двух способов.


Если вопрос был «для каждые целых чисел n ≥ 0 существует ли тип , который имеет ровно n значений ?» ответ будет "да", так как для n = 1 у вас есть datatype One = One, для n = 2 у вас есть datatype Two = One | Two и так далее. Для n = 0 вы можете создать абстрактный / непрозрачный тип без открытых конструкторов. В Haskell этот тип просто data Void без = ... части, но при отсутствии этого синтаксиса в SML вы можете сделать что-то вроде:

signature VOID = sig type t end
structure Void :> VOID = struct type t = unit end

fun whyNot (x : Void.t) = "I wonder how one might call this function."

Даже если Void.t определяется как unit, он также сделан непрозрачным, скрывая конструктор значения ():

- whyNot ();
! Toplevel input:
! whyNot ();
!        ^^
! Type clash: expression of type
!   unit
! cannot have type
!   Void.t

Таким образом, эквивалентность между Void.t и unit не раскрывается , давая тип Void.t 0 значений.

0 голосов
/ 28 января 2020

Вопрос, как оказалось, имеет очень простой ответ: Нет.

Причина в том, что стандартный ML основан на системе типов с предполагаемой типизацией (в частности, системе типов Хиндли Милнера). В этой системе типов существует ровно один политип для каждого значения. Возможно, вы захотите рассмотреть политип, который включает в себя неограниченное количество типов, например, type: 'a ->' a включает в себя очень много типов, например, int-> int. В этом случае было бы бесконечное число типов для любого политипа HM, например, типа, который имеет параметры, и конечного числа типов, точно один, для любого значения, тип которого не является политипом.

В итоге: любое корректное значение в ML имеет один политип и либо один, либо бесконечно монотипы.

...