[Moscow.pm] Строгая типизация в Perl

Андрей П. Ковбович akovbovich на gmail.com
Сб Сен 1 06:49:38 PDT 2012


1 сентября 2012 г., 2:14 пользователь Nikita Zubkov
<nikzubkov на gmail.com> написал:
> То есть получается, что я могу сложить строки (type string) в кодировках
> utf8 и latin1. Где в приведенном примере это запрещение? В string ложится
> байтовая последовательность, не привязанная к кодировке и это не
> контролируется ни на каком этапе.

Прежде чем делать ошибочные выводы, проверили бы.

# open CamomileLibraryDefault.Camomile;;
# module UTF8 = (UTF8 : UnicodeString.Type);;
module UTF8 : CamomileLibraryDefault.Camomile.UnicodeString.Type
# module UTF8Conv = CharEncoding.Make(UTF8);;
module UTF8Conv :
  sig
    type text = UTF8.t
    val decode :
      CamomileLibraryDefault.Camomile.CharEncoding.t -> string -> text
    val encode :
      CamomileLibraryDefault.Camomile.CharEncoding.t -> text -> string
  end
# let latin1 = "hello";;
val latin1 : string = "hello"
# let utf8 = UTF8Conv.decode (CharEncoding.latin1) latin1;;
val utf8 : UTF8Conv.text = <abstr>
# latin1, utf8;;
- : string * UTF8Conv.text = ("hello", <abstr>)

теперь пробуем склеить строки

# latin1 ^ utf8;;
Error: This expression has type UTF8Conv.text = UTF8.t
       but an expression was expected of type string

а если снова привести к одной кодировке

# latin1 ^ (UTF8Conv.encode CharEncoding.latin1 utf8);;
- : string = "hellohello"

> Таким образом, Ваш начальный тезис не подтвердился. Данная библиотека не
> использует строгую типизацию в указанной Вами манере и тезис про извращение
> в силе.

Подтвердился, см. выше.


Подробная информация о списке рассылки Moscow-pm