Size: a a a

2020 October 18

АВ

Андрей Вилинский... in F# Chat
кстати в тему, вот тут же cpu тоже какой-то CpuBuilder, или как это делается?

config {
   cpu {
       min 0.5
       max 0.5
   }
   ram (GB 2.5)
}
источник

AH

Ayrat Hudaygulov in F# Chat
Андрей Вилинский
кстати в тему, вот тут же cpu тоже какой-то CpuBuilder, или как это делается?

config {
   cpu {
       min 0.5
       max 0.5
   }
   ram (GB 2.5)
}
Да, билдер, такой же как config, с двумя кастоиными операциями
источник

RM

Roman Melnikov in F# Chat
Ayrat Hudaygulov
Да, билдер, такой же как config, с двумя кастоиными операциями
А как он значение в config builder передает?
источник

AH

Ayrat Hudaygulov in F# Chat
Roman Melnikov
А как он значение в config builder передает?
Да проще код скинуть, да
источник

AH

Ayrat Hudaygulov in F# Chat
Roman Melnikov
А как он значение в config builder передает?
type CpuBuilder() =
   member _.Yield _ = Config()
   [<CustomOperation("min")>]
   member _.SetMin(config: Config, value: double) =
       config.["cpu.min"] <- string value
       config
   [<CustomOperation("max")>]
   member _.SetMax(config: Config, value: double) =
       config.["cpu.max"] <- string value
       config

когда ты открываешь CPU билдер, он создаёт новый конфиг и заполняет его у себя

Когда ты выходишь из CPU билдера в билдер выше вызывается Combine
    member _.Combine(mainConfig: Config, subConfig: Config) =
       for KeyValue(key, value) in subConfig do
           mainConfig.[key] <- value
       mainConfig
источник

RM

Roman Melnikov in F# Chat
Ayrat Hudaygulov
type CpuBuilder() =
   member _.Yield _ = Config()
   [<CustomOperation("min")>]
   member _.SetMin(config: Config, value: double) =
       config.["cpu.min"] <- string value
       config
   [<CustomOperation("max")>]
   member _.SetMax(config: Config, value: double) =
       config.["cpu.max"] <- string value
       config

когда ты открываешь CPU билдер, он создаёт новый конфиг и заполняет его у себя

Когда ты выходишь из CPU билдера в билдер выше вызывается Combine
    member _.Combine(mainConfig: Config, subConfig: Config) =
       for KeyValue(key, value) in subConfig do
           mainConfig.[key] <- value
       mainConfig
Понял.
Спасибо
источник

АВ

Андрей Вилинский... in F# Chat
The result of this expression has type 'Config' and is implicitly ignored.

чего-то не хватает
источник

АВ

Андрей Вилинский... in F# Chat
а если CpuBuilder.Yield возвращает скажем Cpu() а не Config(), тогда их не совместить?
источник

VK

Viacheslav Koryagin in F# Chat
Андрей Вилинский
а если CpuBuilder.Yield возвращает скажем Cpu() а не Config(), тогда их не совместить?
Можешь Combine перегрузить с типом Cpu
источник

AH

Ayrat Hudaygulov in F# Chat
Андрей Вилинский
The result of this expression has type 'Config' and is implicitly ignored.

чего-то не хватает
Все так. Там пара мемберов нужна ещё.
источник

AH

Ayrat Hudaygulov in F# Chat
Андрей Вилинский
а если CpuBuilder.Yield возвращает скажем Cpu() а не Config(), тогда их не совместить?
Перегрузи комбайн, да
источник

AH

Ayrat Hudaygulov in F# Chat
Ayrat Hudaygulov
type CpuBuilder() =
   member _.Yield _ = Config()
   [<CustomOperation("min")>]
   member _.SetMin(config: Config, value: double) =
       config.["cpu.min"] <- string value
       config
   [<CustomOperation("max")>]
   member _.SetMax(config: Config, value: double) =
       config.["cpu.max"] <- string value
       config

когда ты открываешь CPU билдер, он создаёт новый конфиг и заполняет его у себя

Когда ты выходишь из CPU билдера в билдер выше вызывается Combine
    member _.Combine(mainConfig: Config, subConfig: Config) =
       for KeyValue(key, value) in subConfig do
           mainConfig.[key] <- value
       mainConfig
type ConfigBuilder() =
   member _.Zero() = Config()
   member this.Yield (_: unit)= this.Zero()
   member this.Yield x = x
   member _.Delay f = f()
   member _.Combine(mainConfig: Config, subConfig: Config) =
       for KeyValue(key, value) in subConfig do
           mainConfig.[key] <- value
       mainConfig
   
   [<CustomOperation("ram")>]
   member _.SetRam(state: Config, size: Bytes) =
       state.["ram"] <- string size
       state
   member _.Run x = JsonConvert.SerializeObject x

@vilinski вот полный пример
источник

AH

Ayrat Hudaygulov in F# Chat
для имплист Yield нужен Delay, Zero, Yield
источник

AH

Ayrat Hudaygulov in F# Chat
чтобы можно было писать билдеры вида

builder {
 1
 2
 3
}
источник

АВ

Андрей Вилинский... in F# Chat
ах точно, тут же имплисит Yield, да спс Delay нехватало
источник

PD

Prunkles Dreemurr in F# Chat
Ayrat Hudaygulov
type CpuBuilder() =
   member _.Yield _ = Config()
   [<CustomOperation("min")>]
   member _.SetMin(config: Config, value: double) =
       config.["cpu.min"] <- string value
       config
   [<CustomOperation("max")>]
   member _.SetMax(config: Config, value: double) =
       config.["cpu.max"] <- string value
       config

когда ты открываешь CPU билдер, он создаёт новый конфиг и заполняет его у себя

Когда ты выходишь из CPU билдера в билдер выше вызывается Combine
    member _.Combine(mainConfig: Config, subConfig: Config) =
       for KeyValue(key, value) in subConfig do
           mainConfig.[key] <- value
       mainConfig
Почему, кстати, почти все определяют метод Yield(_), хотя можно, и даже капельку безопаснее будет определить Yield(()) ?
источник

AH

Ayrat Hudaygulov in F# Chat
Prunkles Dreemurr
Почему, кстати, почти все определяют метод Yield(_), хотя можно, и даже капельку безопаснее будет определить Yield(()) ?
Ну да, можно)
источник

PD

Prunkles Dreemurr in F# Chat
Prunkles Dreemurr
Почему, кстати, почти все определяют метод Yield(_), хотя можно, и даже капельку безопаснее будет определить Yield(()) ?
Хотя как это работает я до сих пор не понимаю
источник

Dv

Dr. Friedrich von Ne... in F# Chat
Prunkles Dreemurr
Почему, кстати, почти все определяют метод Yield(_), хотя можно, и даже капельку безопаснее будет определить Yield(()) ?
Кажется, про это даже оговорка на докладе была. Ты правильно говоришь.
источник

A

Anton in F# Chat
источник