Size: a a a

Elm Lang сообщество разработчиков

2020 August 01

AK

Anton Kotenko in Elm Lang сообщество разработчиков
philipp
я вижу только 2 пути в таких случаях если я не прав то пусть дополнят или поправят меня буду признателен) 1. т.н reusable views тоесть Gui не имеют собственных конкретных Msg  а принимают все обработчики через рагументы и возвращают Html msg где msg будет в обработчиках, cоответственно функций update у них нет. 2. Gui содержит Msg ... тогда сверху должна прити функция которая замапит Msg на msg. А заворачивать msg в Maybe нет резона потому что Html и Cmd требуют аргумент все равно
1. Тогда отказаться от MUV, да. Но в принципе надо подумать, может и правда стоит. Можно объединить GuiMsg в одну сущность, однообразно описывающую изменения и продюсить её. 2. Получать функцию для маппинга, не думал об этом, интересно тоже, спасибо! Выход для Maybe — принять пользовательский мессадж типа NoOp, не понял до конца, как можно обойтись Cmd.none?
источник

p

philipp in Elm Lang сообщество разработчиков
если gui содержит Msg то скорее всего у него есть рядом update в котором этот Msg перебирается а возвращать его тогда нет смысла в этом случае возвращается Cmd Msg, если никако го Cmd нет тогда возвращается Cmd.none
источник

p

philipp in Elm Lang сообщество разработчиков
если возвращать Msg то в верхнуем update нужно будет импортировать все кейсы чтобы их обработать, тогда можно просто передать во view функции с месседжами
источник

p

philipp in Elm Lang сообщество разработчиков
например в gui есть инпут на котором нужно сделать автофокус при открытии, есть месседж InputFocused возвращать этот месседж наверх нет смысла потому что тогда пользователю самому нужно обработать эту штуку. Это поведение нужно сокрыть внутри gui компонента поэтому вместо того чтобы вернуть Msg InputFocused нужно вернуть Cmd Msg в котором будет Task с обработкой автофокуса, а для событий таких как onClick где позователь сам волен выбирать какой месседж завернуть в onClick то gui просто принимает аргумент onClick msg и вернет Html msg
источник

p

philipp in Elm Lang сообщество разработчиков
для того чтобы привести 2 типа msg к одному можно прокинуть функцию которая заврочивает GuiMsg в UserMsg,
источник
2020 August 02

A

Alex in Elm Lang сообщество разработчиков
написал на элме свой велос map2, поправьте если что

map2 : (a -> b -> c) -> List a -> List b -> List c
map2 f xs ys =
   let
       helper maybe =
           case maybe of
               Just xs_ -> xs_  
               Nothing -> []

       ab = (List.head xs, List.head ys)
       as_ = helper (List.tail xs)
       bs = helper (List.tail ys)
   in
   case ab of
       (Just x, Just y) ->
           (f x y) :: zipWith f as_ bs
           
       (_, _) ->
           []
источник

DK

Denis Krivosheev in Elm Lang сообщество разработчиков
Так оно вроде в стандартной Либерти есть
источник

DK

Denis Krivosheev in Elm Lang сообщество разработчиков
Или это упражнение?
источник

k

kl mw in Elm Lang сообщество разработчиков
Alex
написал на элме свой велос map2, поправьте если что

map2 : (a -> b -> c) -> List a -> List b -> List c
map2 f xs ys =
   let
       helper maybe =
           case maybe of
               Just xs_ -> xs_  
               Nothing -> []

       ab = (List.head xs, List.head ys)
       as_ = helper (List.tail xs)
       bs = helper (List.tail ys)
   in
   case ab of
       (Just x, Just y) ->
           (f x y) :: zipWith f as_ bs
           
       (_, _) ->
           []
вместо head и tail лучше паттерн матчинг по спискам и все будет гораздо проще читаться
источник

K

Kir in Elm Lang сообщество разработчиков
Alex
написал на элме свой велос map2, поправьте если что

map2 : (a -> b -> c) -> List a -> List b -> List c
map2 f xs ys =
   let
       helper maybe =
           case maybe of
               Just xs_ -> xs_  
               Nothing -> []

       ab = (List.head xs, List.head ys)
       as_ = helper (List.tail xs)
       bs = helper (List.tail ys)
   in
   case ab of
       (Just x, Just y) ->
           (f x y) :: zipWith f as_ bs
           
       (_, _) ->
           []
Поправил
map2 : (a -> b -> c) -> List a -> List b -> List c
map2 f =
 let
   loop xs ys =
     case (xs, ys) of
       (x :: xs1, y :: ys1) -> f x y :: loop xs1 ys1
       _ -> []
 in
   loop
Можно и без loop, но будет чуть больше аллокаций.

1) Все эти хелперы с их Maybe-функциями не нужны, потому что их можно выразить одним сопоставлением с образцом.
2) В модуле List стандартной библиотеке elm нет zipWith.
3) Разве zipWith не работал бы до тех пор, пока один из списков не кончится?
4) Если бы он был, то map2 = zipWith.
5) Ваша функция делает много разного над первыми двумя элементами, а потом просто вызывает zipWith для остального списка.
6) Ваш helper - это Maybe.withDefault [].
источник

A

Alex in Elm Lang сообщество разработчиков
Denis Krivosheev
Или это упражнение?
Для общего развития
источник

A

Alex in Elm Lang сообщество разработчиков
Kir
Поправил
map2 : (a -> b -> c) -> List a -> List b -> List c
map2 f =
 let
   loop xs ys =
     case (xs, ys) of
       (x :: xs1, y :: ys1) -> f x y :: loop xs1 ys1
       _ -> []
 in
   loop
Можно и без loop, но будет чуть больше аллокаций.

1) Все эти хелперы с их Maybe-функциями не нужны, потому что их можно выразить одним сопоставлением с образцом.
2) В модуле List стандартной библиотеке elm нет zipWith.
3) Разве zipWith не работал бы до тех пор, пока один из списков не кончится?
4) Если бы он был, то map2 = zipWith.
5) Ваша функция делает много разного над первыми двумя элементами, а потом просто вызывает zipWith для остального списка.
6) Ваш helper - это Maybe.withDefault [].
Да вот не знал как можно извлечь значение первого элемента списка, теперь знаю спасибо!
источник

A

Alex in Elm Lang сообщество разработчиков
kl mw
вместо head и tail лучше паттерн матчинг по спискам и все будет гораздо проще читаться
Вот как раз не знал его
источник

A

Alex in Elm Lang сообщество разработчиков
Kir
Поправил
map2 : (a -> b -> c) -> List a -> List b -> List c
map2 f =
 let
   loop xs ys =
     case (xs, ys) of
       (x :: xs1, y :: ys1) -> f x y :: loop xs1 ys1
       _ -> []
 in
   loop
Можно и без loop, но будет чуть больше аллокаций.

1) Все эти хелперы с их Maybe-функциями не нужны, потому что их можно выразить одним сопоставлением с образцом.
2) В модуле List стандартной библиотеке elm нет zipWith.
3) Разве zipWith не работал бы до тех пор, пока один из списков не кончится?
4) Если бы он был, то map2 = zipWith.
5) Ваша функция делает много разного над первыми двумя элементами, а потом просто вызывает zipWith для остального списка.
6) Ваш helper - это Maybe.withDefault [].
Там я изначально назвал zipWith, а потом исправил на map2
источник

K

Kir in Elm Lang сообщество разработчиков
ааа
источник
2020 August 04

MP

Max P in Elm Lang сообщество разработчиков
Привет, есть вопрос в стиле "а как вы это решаете".
У меня ошибка (кинул скрином)

view : Model -> VirtualDom.Node Msg
а надо
view : Model -> Browser.Document Msg

Не совсем понимаю, куда идти и что читать.. то есть банально гуглить не хочется (да и гугление не помогло), хотелось бы провалиться толи в код, чтобы понять наверняка, то ли просто в документацию библиотеки. Но я попробовал, и пока не вижу где мне найти ответ)

Как вы поступаете, когда видите текст ошибки?
источник

AP

Aleksei (astynax) Pi... in Elm Lang сообщество разработчиков
Ну вы просто возвращаете HTML
источник

AP

Aleksei (astynax) Pi... in Elm Lang сообщество разработчиков
А нужно обернуть в Document
источник

AP

Aleksei (astynax) Pi... in Elm Lang сообщество разработчиков
У вас же есть тип, который хочет компилятор. Обычно рядом с типом лежат функции, помогающие получить значения этого типа
источник

AP

Aleksei (astynax) Pi... in Elm Lang сообщество разработчиков
источник