Здравствуйте, DarthSidius, Вы писали:
DS>Здравствуйте, -VaS-, Вы писали:
VS>>Есть ли в Nemerle non-nullable типы, как в F#?
DS>Options?
Подозреваю имеется ввиду по умолчанию типы без null значения.
И такого в Nemerle нет.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, DarthSidius, Вы писали:
DS>>Здравствуйте, -VaS-, Вы писали:
VS>>>Есть ли в Nemerle non-nullable типы, как в F#?
DS>>Options? _NN>Подозреваю имеется ввиду по умолчанию типы без null значения. _NN>И такого в Nemerle нет.
Да, именно. Жаль И что интересно, этого нельзя добиться даже макросами.
Здравствуйте, -VaS-, Вы писали:
DS>>>Options? _NN>>Подозреваю имеется ввиду по умолчанию типы без null значения. _NN>>И такого в Nemerle нет.
VS>Да, именно. Жаль И что интересно, этого нельзя добиться даже макросами.
Тут палка о двух концах, с одной стороны хотим удобную интеграцию с остальным .NET миром включая C# где такого понятия нет.
С другой стороны хотим удобств в виде безнулевых типов.
Даже в Kotlin не смогли изначально сделать, чтобы и было удобно и безопасно.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, -VaS-, Вы писали:
DS>>>>Options? _NN>>>Подозреваю имеется ввиду по умолчанию типы без null значения. _NN>>>И такого в Nemerle нет.
VS>>Да, именно. Жаль И что интересно, этого нельзя добиться даже макросами. _NN>Тут палка о двух концах, с одной стороны хотим удобную интеграцию с остальным .NET миром включая C# где такого понятия нет. _NN>С другой стороны хотим удобств в виде безнулевых типов. _NN>Даже в Kotlin не смогли изначально сделать, чтобы и было удобно и безопасно.
В F# сделали изначально. Получилось отлично: в F# коде нельзя присвоить переменным/полям/свойствам non-nullable типа null и нельзя передать null качестве аргумента таких типов. Из других языков .NET такие типы видны как обычные и, естесственно, в F# сборку может приплыть null. На практике фича сильно повышает надежность кода и считается одной из самых сильных фич F#. Я думаю, стоило бы изучить, как именно это реализовано и перенести в Nemerle.
Здравствуйте, -VaS-, Вы писали:
VS>В F# сделали изначально. Получилось отлично: в F# коде нельзя присвоить переменным/полям/свойствам non-nullable типа null и нельзя передать null качестве аргумента таких типов. Из других языков .NET такие типы видны как обычные и, естесственно, в F# сборку может приплыть null. На практике фича сильно повышает надежность кода и считается одной из самых сильных фич F#. Я думаю, стоило бы изучить, как именно это реализовано и перенести в Nemerle.
Когда в контексте того же C# говорят о non-nullable, люди хотят помечать таким образом не типы, а аргументы, поля и переменные. Чтобы гарантировать, что null не сможет приехать вместо строк, например.
В F# в этом плане достаточно деревянно всё сделано. F#-овские типы помечены спецатрибутом, который говорит, что они F#-овские и не даёт переменным и полям такого типа присваивать null. Чтобы отключить это поведение тип должен быть помечен атрибутом AllowNullLiteral. При этом из строки non-nullable сделать никак нельзя.
Например:
[<AllowNullLiteralAttribute>]
type MyType = class end
let callMe(lst : System.String) =
printfn "%i" lst.Length
let callMeMt(mt : MyType) =
printfn "%s" (mt.ToString())
[<EntryPoint>]
let main argv =
callMe null
callMeMt null
0
K>Когда в контексте того же C# говорят о non-nullable, люди хотят помечать таким образом не типы, а аргументы, поля и переменные. Чтобы гарантировать, что null не сможет приехать вместо строк, например.
Согласен насчет строк в F#, приходится оборачивать / доставать в нормальные типы на границах.
Не согласен, что развешивание атрибутов во всех местах, где встречается тип, лучше, или даже жизнеспособно. Т.к. non-nullability нужно/желательно в 99.9% случаев, код будет процентов на 30 состоять из этих самых атрибутов. Далее, нично не гарантирует / предупредит тебя, если ты забудешь этот атрибут повесить. Т.е. решение на уровне if (x == null) throw new ArgNullExn("x"), только времени компиляции (что уже лучше, конечно).