代码之家  ›  专栏  ›  技术社区  ›  sof

将泛型类型变量统一到另一个现有类型

  •  2
  • sof  · 技术社区  · 6 年前

    有一个 line Elm guide 下图:

    Task.perform AdjustTimeZone Time.here
    

    我发现了以下类型签名:

    -- ∵
    AdjustTimeZone :  Zone -> Msg
    here           :                  Task x     Zone
    perform        : (a    -> msg) -> Task Never a    -> Cmd msg 
    -- ∴
    perform AdjustTimeZone here :                        Cmd Msg
    

    Task x Zone 统一于 Task Never a x Never 是值得怀疑的 Zone a 合理的。

    1 回复  |  直到 6 年前
        1
  •  3
  •   glennsl Namudon'tdie    6 年前

    我不是类型推理专家,但我认为这样说是不对的” x Never “并怀疑这是你困惑的根源。 a 两个类型变量都将以任何方式统一,除非有其他冲突的约束。所以就像 变成 Zone , 从未 ,而不是相反。

    你可能也想知道为什么 Time.here 具有类型 Task x Zone Task Never Zone 毕竟,这是 here 应该知道它是否会出错。我 认为 这是因为1)它不重要(对于类型系统来说,尽管对于用户来说确实可能),2)它使它更容易组合。

    时间到了。这里 和其他人在一起 Task 可以 错误。 Task.andThen 具有类型 (a -> Task x b) -> Task x a -> Task x b (错误)类型变量在所有 s、 所以如果 时间到了。这里 任务从不区 ,我们必须提供 andThen Zone -> Task Never b

    我很确定你可以 TasK.here |> Task.mapError never |> Task.andThen (\zone -> ...) ,但如果错误类型保留为类型变量而不是约束为 从未 Task.here 不会产生任何影响 s、 所以它作为一个整体是什么并不重要。