s = string), но с s<foo> я обломался
это UMX с алиасами типов не работает или я его готовить не умею
??
код полностью:
[<Measure>] type Foo
type s = string
let f (arg: s<Foo>) = ()
//=> The non-generic type 'Program.s' does not expect any type arguments, but here is given 1 type argument(s)F# Compiler33
ты наверное так хотел? #r "nuget: FSharp.UMX" open FSharp.UMX [<Measure>] type Foo type s = string<Foo> let f (arg: s) = ()
Но так ведь ещё короче?
моё "короче" - без потери данных о типе в описании :)) ну серьёзно, удобнее же когда s<Foo>, а не s (учитывая, что тебе известно, что s = string)
хз, это субъективно. лично мне - не удобнее
а ты это как видишь, как указание типа в аргументе ф-ции? или как выведенная компилятором "цепочка типов" у ф-ции? просто во втором случае намного удобнее, если "цепочку типов" укоротить как-то я конечно могу сделать алиасы наподобие s'Foo, но тогда нахрена мне, спрашивается, UMX? 🤣🤣🤣 [в таком случае я и без measure обойдусь]
да не, Measure же на для алиасов нужны. это удобный способ сделать обёртку, которая будет помогать во время компиляции, но в рантайме от неё никакого оверхэда не будет
UMX удобен выделением "логики" в отдельную "ветвь" (measure) если же делать свои алиасы, то это не выделение "логики", а выделение "синтаксиса"
вот этого я вообще не понял
Да, удобнее когда непонятный тип, вместо привычного (нет).
когда у тебя вывод типов у ф-ции показывает вот такое: // #1 string<Foo> -> string<Bar> -> string<Baz> -> ... // #2 int<Foo> -> int<Bar> -> int<Baz> -> ... это значит, что ты используешь measure + UMX для выноса "логики" (на уровень [<Measure>] type ...) а когда у тебя вот такое: // #1 s'Foo> -> s'Bar -> s'Baz -> ... // #2 i'Foo -> i'Bar -> i'Baz -> ... это значит "тупое задротство на уровне именования алиасов типов"
я всё равно ничего не понял, но честно говоря и не хочется)
Обсуждают сегодня