任务混合在一个信号中

Task mixed in a signal

我想通过信号向邮箱发送消息。

module Main where

import Graphics.Element exposing (show)
import Html             exposing (..)
import Html.Attributes  exposing (..)
import Html.Extra       exposing (..)
import Signal

import Model.PickList   exposing (pickList)
import Model.BabyName.Debug as Debug

headerPane : Html
headerPane =
  header [ id "header" ]
  [ text "header" ]

leftPane : Signal Html
leftPane = flip Signal.map (.signal pickList) <| \pl ->
  ul []
  [ li []
    [ fromElement << show <| pl ] ]

mainPane : Html
mainPane =
  section [ id "main" ]
  [ text "what? what?" ]

layout : Signal Html
layout = flip Signal.map leftPane <| \lp ->

  div [ id "wrapper" ] <|
  [ headerPane
  , lp
  , mainPane ]

main : Signal Html
main =
  (Signal.send (.address pickList) Debug.dummyList) -- type error
  layout

我觉得我需要的只是 haskell 的 >>。但这些是信号(不是 Monad),没有 do 符号或 >>= \_ -> 种疯狂,我也没有看到 liftTask。 Elm 中的想法是你需要一个外部输入,并且不能从应用程序的角度任意发送?请帮助我理解。

回答

Elm 0.15 中的任务通过 port 发送来执行。这意味着您的 TaskSignal Task 需要在 Main 模块的顶层可用,因为这是您可以声明 port 的唯一位置。这意味着您不能简单地向内联邮箱发送消息(这会产生副作用),您必须确保任务可以通过您的程序流向端口定义。

例子

import Html             exposing (..)
import Html.Attributes  exposing (..)
import Html.Extra       exposing (..)
import Signal

import Model.PickList   exposing (pickList)
import Model.BabyName.Debug as Debug

headerPane : Html
headerPane =
  header [ id "header" ]
  [ text "header" ]

leftPane : Signal Html
leftPane = flip Signal.map (.signal pickList) <| \pl ->
  ul []
  [ li []
    [ fromElement << show <| pl ] ]

mainPane : Html
mainPane =
  section [ id "main" ]
  [ text "what? what?" ]

layout : Signal Html
layout = flip Signal.map leftPane <| \lp ->

  div [ id "wrapper" ] <|
  [ headerPane
  , lp
  , mainPane ]

port toPicklist = Signal.send (.address pickList) Debug.dummyList

main : Signal Html
main = layout

资源