了解类型注释中的类型变量

抢劫

榆树文档说明类型变量是这样的:

> List.reverse
<function> : List a -> List a

...类型变量a可能会因使用List.reverse的方式而异。但是在这种情况下,我们在参数和结果中都有一个“ a”。这意味着,如果您提供List Int,则还必须获得List Int。

Maybe.map的文档显示此注释:

map : (a -> b) -> Maybe a -> Maybe b

那么为什么将类型注释为何a以及b何时必须为同一类型?
我希望a跟踪类型,即:

map : (a -> a) -> Maybe a -> Maybe a
格伦斯

那么为什么将类型注释为何a以及b何时必须为同一类型?

他们不!如果map确实对输入参数类型和返回类型使用相同的类型变量,则可以,但是map可以从一种类型转换为另一种类型。这是一个具体的例子:

Maybe.map String.fromInt (Just 42)

String.fromInt具有类型Int -> String,我们将其用作的第一个参数Maybe.map因此,如果我们尝试将其替换为map

String.fromInt : (Int -> String)
Maybe.map      : (a   -> b     ) -> Maybe a -> Maybe b

我们看到Int替代品aString替代品b因此Maybe a必须是Maybe Int并且Maybe b必须是Maybe String这意味着如果我们尝试给它一个Maybe String代替:

Maybe.map String.fromInt (Just "foo")

我们会得到一个错误:

The 2nd argument to `map` is not what I expect:

1 | foo = Maybe.map String.fromInt (Just "foo")
                                    ^^^^^^^^^^
This `Just` call produces:

    Maybe String

But `map` needs the 2nd argument to be:

    Maybe Int

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解Parsec类型注释

来自分类Dev

打字稿:在注释中设置变量类型

来自分类Dev

打字稿:在注释中设置变量类型

来自分类Dev

了解仅出现在返回类型中的类型变量

来自分类Dev

如何在不同的类型注释中引用相同的类型变量?

来自分类Dev

Python中的类型注释

来自分类Dev

了解类型声明中的类型参数

来自分类Dev

不了解Verilog中的类型

来自分类Dev

Elm REPL中的类型注释

来自分类Dev

函数中的Haskell类型注释

来自分类Dev

使用类型注释来缩小已声明的Python变量的类型

来自分类Dev

如何编写用于从变量注释中获取变量类型的正则表达式?

来自分类Dev

变量中的模板类型

来自分类Dev

Java中的变量类型

来自分类Dev

如何为进入队列的变量添加变量类型注释?

来自分类Dev

链接子类型中类型参数的注释以声明超类型中的类型参数

来自分类Dev

了解Elm中的通用联合类型

来自分类Dev

试图了解F#中的Choice类型

来自分类Dev

了解Elm中的代码段(类型更新)

来自分类Dev

了解集合中的Java绑定通用类型

来自分类Dev

了解函数签名中的类型相等

来自分类Dev

了解C ++中的wchar_t类型

来自分类Dev

了解集合中的Java绑定通用类型

来自分类Dev

了解 Gamesparks 中的数据类型

来自分类Dev

从类型变量中获取实际类型

来自分类Dev

类型中要统一的类型变量

来自分类Dev

类型中要统一的类型变量

来自分类Dev

您如何注释HList中的类型

来自分类Dev

ReSharper无法解析注释中的集合类型