I have a semi-related question/comment while upgrading my website to 0.17.0:
Is the general convention for Msg to not have any maybes anymore? My website has Cmds which have maybe parameters and I'm unsure if I should create additional Cmds for the never cases when I was handling it as a maybe. It makes sense to have explicit handling of failed tasks, but on the other-hand, it's also inconvenient to have Cmds which leads to nothing. On Sunday, May 15, 2016 at 2:09:30 PM UTC-7, Janis Voigtländer wrote: > > Actually, maybe a more useful description would frame this not as what Cmd > does not have that Task has, namely andThen, but instead frame it as what > Cmd offers in addition. It’s the “managed effects” aspect discussed at > http://guide.elm-lang.org/effect_managers/. The two examples you > mentioned, Time.now and Random.generate, are nor actually as similar as > you seem to assume. To support Time.now, the implementation doesn’t need > any effect management in the background. It just asks the operating system > for the current time, and done. To support Random.generate, the > implementation does need to do effect management (magic) in the background. > Namely, it needs to keep track of a hidden seed for the random generator. > That must be preserved/propagated over several calls throughout the > program’s life. That would not be possible with a Task, but it is > possible with a Cmd, thanks to the concept of effect managers. That’s > also the reason why a Task can be turned into a Cmd, but a Cmd can’t be > turned into a Task. So when looking through the available core and > platform libraries, and wondering about why some things are Tasks and > others are Cmds, the reasoning in my understanding is that something is a > Task if it can be, if it can be implemented without effect management > magic behind the scenes, whereas something is a Cmd if it has to be, if > it could not be implemented without hidden effect management. > > > 2016-05-15 22:39 GMT+02:00 Janis Voigtländer <[email protected] > <javascript:>>: > >> Let’s say you want to make an http request where the url to request >> should depend on the current time. You can build a task that does this by >> combining Time.now and Http.getString. Something like Time.now `andThen` >> \time -> Http.getString (queryStringBuildFrom time). Then you turn that >> combined task into a Cmd and return it from your update function. If you >> were to try to do the same with just Cmds, you would have to do Time.now, >> then have an extra round of the update function in which you receive the >> resulting time, turn it into an Http request Cmd, send that off, and >> wait for its result. That’s not necessarily what you want, the extra update >> round, and no guarantee that no other message occurs in between. (That is, >> with the Cmd-only thing, you don’t even know that the two involved >> update rounds happen directly after each other. With Task, you have >> built a thing consisting of time getting and request sending that will >> definitely happen directly one after the other. At least with the current >> state of the Task and scheduler implementation.) >> >> >> 2016-05-15 22:27 GMT+02:00 Zinggi <[email protected] <javascript:>>: >> >>> Thanks Joey and Janis, but I still don't really understand when to use Task >>> x and when to use Cmd. >>> >>> I get that Tasks are more composable than Cmds, but the flexibility (and >>> complexity) seems only necessary if a Task can fail. >>> >>> Basically, I can't think of any actual use of Window.size that doesn't >>> use the just defined performSucceed function. >>> Also, the random library >>> <http://package.elm-lang.org/packages/elm-lang/core/4.0.0/Random#generate> >>> uses >>> a Cmd for something very similar, so I expected the Window.size would also >>> be a Cmd. >>> Time.now >>> <http://package.elm-lang.org/packages/elm-lang/core/4.0.0/Time#now> is >>> another such example where I would have expected a Cmd, but it uses a Task >>> instead. >>> >>> So, what's the difference in usage between a Task x Something and Cmd >>> Something? >>> >>> On Sunday, 15 May 2016 20:16:48 UTC+2, Janis Voigtländer wrote: >>>> >>>> About this: >>>> >>>> However I don’t understand how it works -.-> That never function looks >>>> crazy indeed. Why does it use infinite recursion and not this: >>>> never n = Debug.crash “Well, we’re doomed _(ツ)_/“ >>>> >>>> Joey has provided the answer. >>>> >>>> About this: >>>> >>>> Also regarding my second question, why does Window.size not return a >>>> Cmd? >>>> What benefits does a Task that cannot fail have over a Cmd? >>>> >>>> Tasks are more composable, which you might need in some situations >>>> (combining the Window.size with some other task before turning the >>>> result into a Cmd). The key here is that nothing like >>>> http://package.elm-lang.org/packages/elm-lang/core/4.0.0/Task#andThen >>>> exists for Cmd. >>>> >>>> >>>> 2016-05-15 19:52 GMT+02:00 Zinggi <[email protected]>: >>>> >>>>> Thank you very much! >>>>> This works and is exactly what I wanted. >>>>> >>>>> However I don't understand how it works -.- >>>>> That never function looks crazy indeed. Why does it use infinite >>>>> recursion and not this: >>>>> never n = Debug.crash "Well, we're doomed \_(ツ)_/" >>>>> >>>>> Also regarding my second question, why does Window.size not return a >>>>> Cmd? >>>>> What benefits does a Task that cannot fail have over a Cmd? >>>>> >>>>> Cheers >>>>> >>>>> On Sunday, 15 May 2016 18:47:36 UTC+2, Janis Voigtländer wrote: >>>>>> >>>>>> You should be able to define performSucceed yourself (and with a >>>>>> built-in guarantee that the failing case will definitely not occur): >>>>>> >>>>>> performSucceed : (a -> msg) -> Task Never a -> Cmd msgperformSucceed = >>>>>> Task.perform never >>>>>> never : Never -> anever n = never n >>>>>> >>>>>> which (in particular never) may look daunting, but isn’t. That never >>>>>> function could be hidden away from you, see >>>>>> https://github.com/elm-lang/core/pull/593. >>>>>> >>>>>> 2016-05-15 18:30 GMT+02:00 Zinggi <[email protected]>: >>>>>> >>>>>> I need to get the window >>>>>>> <http://package.elm-lang.org/packages/elm-lang/window/1.0.0> >>>>>>> dimensions, so I'm doing: >>>>>>> >>>>>>> type Msg = GetScreenSizeFailed | UpdateScreenSize Size >>>>>>> Task.perform (always GetScreenSizeFailed) UpdateScreenSize >>>>>>> Window.size >>>>>>> >>>>>>> I was under the impression that getting the window dimension will >>>>>>> never fail, so it seems strange that I need GetScreenSizeFailed at >>>>>>> all. >>>>>>> Is there a function that gives me a Cmd, but only has a success >>>>>>> case? Something with which I could do: >>>>>>> >>>>>>> Task.performSucceed UpdateScreenSize Window.size >>>>>>> >>>>>>> Such a function would only call update if the Task succeeds and if >>>>>>> it fails, just do nothing. Even though failing should be impossible >>>>>>> here. >>>>>>> >>>>>>> Also, why does Window.size return a Task and not a Cmd? >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "Elm Discuss" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to [email protected]. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Elm Discuss" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Elm Discuss" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected] <javascript:>. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> > -- You received this message because you are subscribed to the Google Groups "Elm Discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
