<div>Последнее предложение подытожило весь флейм. Это все верно. Только он не имеет ничего общего со строгой типизацией. )</div><div><br></div><div class="gmail_quote">3 сентября 2012 г., 11:22 пользователь Андрей П. Ковбович <span dir="ltr"><<a href="mailto:akovbovich@gmail.com" target="_blank">akovbovich@gmail.com</a>></span> написал:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">2 сентября 2012 г., 7:01 пользователь Nikita Zubkov<br>
<<a href="mailto:nikzubkov@gmail.com">nikzubkov@gmail.com</a>> написал:<br>
<div class="im">> Как этот пример связан с изначальным тезисом о защите от конкатенации СТРОК<br>
> в разных кодировках?<br>
<br>
</div>Для начала, строкой я называю последовательность символов некого<br>
алфавита, а не тип. Строки представлены типами, отражающую их<br>
кодировку, в том числе абстрактными, скрывающими свое внутренее<br>
представление. Операции (в том числе конкатенация) между<br>
несовместимыми типами пресекаются на этапе тайп чека, как вы уже<br>
видели.<br>
<br>
В примере, примитивный тип string - по сути массив однобайтовых<br>
символов. Для однобайтовых кодировок его вполне достаточно. Как только<br>
у вас появляется юникод, понятно, что многие операции со строками<br>
между однобайтовыми и многобайтовыми кодировками не имеют смысла, вот<br>
тогда и вводятся новые типы для кодировок utf8,16,32. И уже система<br>
типов следит за совместимостью операций между latin1|cp1251 и utf8<br>
кодированными строками и она не даст вам их склеить, так как в этом<br>
нет смысла.<br>
<div class="im"><br>
> Да и Вы же сами в конце показали как прекрасно конкатенируютя СТРОКИ в utf8 и latin1.<br>
<br>
</div>Потому что перед конкатенацией, я преобразовал (сериализовал) юникод<br>
строку в значение типа string (байтовый массив - базовый тип,<br>
согласен, название типа спорно).<br>
val encode : CharEncoding.t -> text -> string<br>
Понятно, что без дополнительных ограничений со стороны системы типов<br>
эта операция будет считаться валидной. Тут уж ответственность на<br>
программисте, контролировать то, что внутри байтовой<br>
последовательности. Опять же, при желании, вы можете настроить ее так,<br>
чтобы это было невозможно.<br>
<br>
module type API = sig<br>
    type uni<br>
    type nonuni<br>
    type 'a str<br>
    val nonuni : string -> nonuni str<br>
    val uni : string -> uni str<br>
    val show : 'a str -> string<br>
    val ( ^ ) : nonuni str -> nonuni str -> nonuni str<br>
  end<br>
<br>
module MyStrings : API = struct<br>
    type nonuni<br>
    type uni<br>
    type 'a str = string<br>
    let nonuni s = s<br>
    let uni s = s<br>
    let show s = s<br>
    let ( ^ ) = Pervasives.( ^ )<br>
  end<br>
<br>
# open MyStrings;;<br>
# let u, u', n, n' = uni "hello", uni "world", nonuni "hello", nonuni "world";;<br>
val u : MyStrings.uni MyStrings.str = <abstr><br>
val u' : MyStrings.uni MyStrings.str = <abstr><br>
val n : MyStrings.nonuni MyStrings.str = <abstr><br>
val n' : MyStrings.nonuni MyStrings.str = <abstr><br>
<br>
(* nonuni str + nonuni str = ok *)<br>
# show (n ^ n');;<br>
- : string = "helloworld"<br>
<br>
(* uni str + nonuni str = fail *)<br>
# show (u ^ n');;<br>
Error: This expression has type MyStrings.uni MyStrings.str<br>
       but an expression was expected of type MyStrings.nonuni MyStrings.str<br>
<br>
(* uni str + uni str = fail *)<br>
# show (u ^ u');;<br>
Error: This expression has type MyStrings.uni MyStrings.str<br>
       but an expression was expected of type MyStrings.nonuni MyStrings.str<br>
<br>
Раз уж я привел в пример библиотеку для работы с юникодом, если<br>
позволите, переформулирую первоначальный тезис, чтобы оставить в покое<br>
однобайтовые кодировки - вы не сможете склеить по ошибке utf8 и utf16<br>
строки без явного кастинга (строгая типизация в действии).<br>
<div class="HOEnZb"><div class="h5">--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>С уважением,<br>Никита Зубков<br>