Elm 如何合并嵌套标记类型的信号?

Elm 如何合并嵌套标记类型的信号?,elm,Elm,作为我正在构建的Elm应用程序的一部分,我希望保持环境变化(如调整窗口大小)的信号不受数据变化(向浏览器呈现可过滤的模型列表)的影响。我想我会将这些模型建模为不同的可扩展类型: type WindowUpdate = Resize (Int, Int) type DataUpdate = TagFilter Model.Tag type Update update data = WindowUpdate update data | DataUp

作为我正在构建的Elm应用程序的一部分,我希望保持环境变化(如调整窗口大小)的信号不受数据变化(向浏览器呈现可过滤的模型列表)的影响。我想我会将这些模型建模为不同的可扩展类型:

type WindowUpdate = Resize (Int, Int)

type DataUpdate = TagFilter Model.Tag

type Update update data = WindowUpdate update data
                        | DataUpdate update data
                        | NoOp

updates : Signal.Mailbox (Update update data)
updates = Signal.mailbox NoOp

appModel : Signal Model
appModel =
  let
    applicationUpdates = Signal.mergeMany
                       [ updates.signal

                       ]
  in
    Signal.foldp update Model.defaultModel applicationUpdates

windowUpdate : WindowUpdate -> Model -> Model
windowUpdate update model =
    let resizeWidth = \windowModel newWidth -> { windowModel | width = newWidth }
    in
      case update of
        Resize (w, _) -> { model | window = (resizeWidth model.window w) }

update : Update -> Model -> Model
update u model =
  case u of
    WindowUpdate wu data -> windowUpdate (wu data)  model
    DataUpdate du data  -> model
    otherwise       -> model
不幸的是,我无法让我的更新功能正常工作。我发现以下编译器错误:

— TYPE MISMATCH —————————————————————— ./app/Updates.elm

The 3rd argument to function `foldp` is causing a mismatch.

36│     Signal.foldp update Model.defaultModel applicationUpdates
                                               ^^^^^^^^^^^^^^^^^^
Function `foldp` is expecting the 3rd argument to be:

    Signal (Update a)

But it is:

    Signal Update

Hint: I always figure out the type of arguments from left to right. If an
argument is acceptable when I check it, I assume it is "correct" in subsequent checks. So the problem may actually be in how previous arguments interact with the 3rd.

我做错了什么?

您在
更新
的签名中忘记了
更新
的类型参数,应该是(代码未测试):


update:update-update-data->Model->Model

“类型签名中不能有构造函数”…我想(因为我声明了
WindowUpdate
作为一个类型,我可以将它作为签名中的一个类型?为什么不呢?@andrewdotnich:对不起,我不应该在睡梦中回答这样的问题:)没有看到类型声明,只有
中的构造函数键入updatedata=windowupdatedata