Haskell中两个函数的最通用的“乘积”类型

武卡塞纳(Vucicasena)

我必须在Haskell中从给定的函数中找到最通用的类​​型,或者如果存在的话,就找到两个函数的“乘积”的最通用的类​​型。我不确定,但也许我应该使用鲁滨逊统一算法,但我听不懂。我需要逐步的详细解决方案,这样我才能理解。

功能 :

map :: (a → b) → [a] → [b] 
iterate :: (a → a) → a → [a]

如何找到最通用的类​​型

  1. map iterate
  2. iterate map

这不是功课。

内斯

首先,明确写出所有省略的括号。

若要派生类型函数和类型a -> b的应用程序类型c,我们需要统一类型ac,并注意产生的所有类型等效项。然后b,在上述等效条件下,应用程序的类型为规则是:

f   ::     a → b
x   ::     c
        ----------
f x ::         b      , { a ~ c }

要半机械地找到它,只需对齐类型并注意等效项即可:

map ::    (   a1     →     b1     ) → ([a1] → [b1]) 
iterate :: (a2 → a2) → (a2 → [a2])
          --------------------------
        { a1 ~ (a2 → a2) , b1 ~ (a2 → [a2]) }

所以,

map iterate :: [a1] → [b1]

用等价代替,我们得到

            :: [a2 → a2] -> [a2 → [a2]]

现在,我们可以重命名a2a,或t,或其他名称。您的第二个示例类似:

iterate :: (   a2     →       a2     ) → (a2 → [a2])
map ::      (a1 → b1) → ([a1] → [b1]) 
           ---------------------------
        { a2 ~ a1 → b1 ,  a2 ~ [a1] → [b1] }

由于a2 ~ a2,我们得到a1 → b1 ~ [a1] → [b1]

               a1  →  b1
              [a1] → [b1]
            --------------
        { a1 ~ [a1] ,  b1 ~ [b1] }

两种对等都是不可能的,请定义一个无限类型。因此,第二个示例在Haskell中没有类型:

* Main>:t映射迭代
map迭代:: :: [a-> a]-> [a-> [a]]

* Main>:t迭代映射

:1:9:
发生检查:无法构造无限类型:a〜 [a]
预期类型:(a-> b)->
a- > b实际类型:(a-> b)-> [a]-> [b]
在“ iterate”的第一个参数中,即“ map”
在表达式中:迭代映射

:1:9:进行
检查:无法构造无限类型:b〜[b]
预期类型:(a-> b)->
a- > b实际类型:(a-> b)- > [a]-> [b]
在“ iterate”的第一个参数中,即“ map”
在表达式中:iterate map

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Haskell中以下函数的最通用类型

来自分类Dev

可以容纳两个size_t乘积的类型

来自分类Dev

为什么在TableColumn <T,S>中对两个通用类型都使用相同的通用类型?

来自分类Dev

两个矩阵的乘积

来自分类Dev

Haskell从两个列表中绘制函数参数

来自分类Dev

Haskell从两个列表中绘制函数参数

来自分类Dev

如何为这两个具有相同定义的函数提供更通用的类型?

来自分类Dev

在两个单独的函数调用中要求类型相等

来自分类Dev

在 Haskell 中将两个函数相加

来自分类Dev

Haskell多功能函数,它接受两个数字并返回乘积而不使用乘号(*)或除号(/)

来自分类Dev

两个beta分布的乘积

来自分类Dev

如何获得两个RDD的乘积?

来自分类Dev

整合两个功能的乘积

来自分类Dev

带螺纹的两个矩阵的乘积

来自分类Dev

如何获得两个清单的乘积?

来自分类Dev

如何整合两个功能的乘积

来自分类Dev

枚举Haskell的总和和乘积类型的通用算法?

来自分类Dev

枚举Haskell的总和和乘积类型的通用算法?

来自分类Dev

使用两个类型的通用参数进行Ninject绑定

来自分类Dev

在Typescript上创建具有两个通用类型的对

来自分类Dev

在Haskell编程中,如何通过交替组合两个函数列表返回函数?

来自分类Dev

如果两个整数的乘积落在浮点类型的无损范围内,是否会无损?

来自分类Dev

在C ++函数中返回两种不同类型的两个值

来自分类Dev

Haskell高阶函数。传递两个函数作为参数。

来自分类Dev

异步函数不允许打字稿中两个诺言类型的返回类型

来自分类Dev

unfoldr中的lambda函数如何与Haskell中的两个参数一起使用?

来自分类Dev

如何在haskell中声明两个包含相同变量的数据类型?

来自分类Dev

如何在Java中编写一个采用两个相同类型参数的通用方法?

来自分类Dev

Haskell中的函数未获取通用类型参数

Related 相关文章

  1. 1

    Haskell中以下函数的最通用类型

  2. 2

    可以容纳两个size_t乘积的类型

  3. 3

    为什么在TableColumn <T,S>中对两个通用类型都使用相同的通用类型?

  4. 4

    两个矩阵的乘积

  5. 5

    Haskell从两个列表中绘制函数参数

  6. 6

    Haskell从两个列表中绘制函数参数

  7. 7

    如何为这两个具有相同定义的函数提供更通用的类型?

  8. 8

    在两个单独的函数调用中要求类型相等

  9. 9

    在 Haskell 中将两个函数相加

  10. 10

    Haskell多功能函数,它接受两个数字并返回乘积而不使用乘号(*)或除号(/)

  11. 11

    两个beta分布的乘积

  12. 12

    如何获得两个RDD的乘积?

  13. 13

    整合两个功能的乘积

  14. 14

    带螺纹的两个矩阵的乘积

  15. 15

    如何获得两个清单的乘积?

  16. 16

    如何整合两个功能的乘积

  17. 17

    枚举Haskell的总和和乘积类型的通用算法?

  18. 18

    枚举Haskell的总和和乘积类型的通用算法?

  19. 19

    使用两个类型的通用参数进行Ninject绑定

  20. 20

    在Typescript上创建具有两个通用类型的对

  21. 21

    在Haskell编程中,如何通过交替组合两个函数列表返回函数?

  22. 22

    如果两个整数的乘积落在浮点类型的无损范围内,是否会无损?

  23. 23

    在C ++函数中返回两种不同类型的两个值

  24. 24

    Haskell高阶函数。传递两个函数作为参数。

  25. 25

    异步函数不允许打字稿中两个诺言类型的返回类型

  26. 26

    unfoldr中的lambda函数如何与Haskell中的两个参数一起使用?

  27. 27

    如何在haskell中声明两个包含相同变量的数据类型?

  28. 28

    如何在Java中编写一个采用两个相同类型参数的通用方法?

  29. 29

    Haskell中的函数未获取通用类型参数

热门标签

归档