type-inference - 将泛型类型变量统一到另一个现有类型
问题描述
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
toNever
是可疑的,而Zone
to是a
合理的。
解决方案
我不是类型推理专家,但我认为说“x
统一到Never
”是不正确的,并且怀疑这是您困惑的根源。x
并且a
都是类型变量,它们将统一任何一种方式,除非有其他约束发生冲突。所以就像a
变成Zone
,x
变成Never
,而不是相反。
您可能还想知道为什么Time.here
有类型Task x Zone
而不是Task Never Zone
因为毕竟它here
应该知道它是否会出错。我认为这是因为 1)它无关紧要(对于类型系统,尽管它对用户来说肯定可能),以及 2)它使它更容易组合。
因此,假设您想Time.here
与其他一些Task
可能出错的序列进行排序。Task.andThen
具有(错误)类型变量在所有s中都相同(a -> Task x b) -> Task x a -> Task x b
的类型。所以如果s 类型是,我们必须提供一个函数。这显然行不通。x
Task
Time.here
Task Never Zone
andThen
Zone -> Task Never b
我很确定您可以这样做TasK.here |> Task.mapError never |> Task.andThen (\zone -> ...)
,但如果错误类型保留为类型变量而不是被限制为Never
. 这不是问题,因为Task.here
不会产生任何x
s,所以它统一为什么并不重要。
推荐阅读
- r - 使用滞后列过滤组
- grails - Groovy 服务器页面,创建表
- python - 如何使用 pySimpleGUI 将两个框架无间隙地彼此相邻
- c# - 如何在 c# .net 中从 pdf 获取链接
- jgit - 如何估计一个 git 版本的大小?
- spring-boot - 如何在 Keycloak 中结合仅持有者和 client_credentials?
- tensorflow - 使用 parquet 文件的 TensorFlow 时间序列分类
- visual-studio - 在 Windows 上从 Visual Studio 读取/写入 docker 卷时出现问题
- powershell - 查找安装模块的源
- r - 循环/或应用函数以将 igraph 对象列表馈送到 R 中的函数中