在Haskell中用+编写*时会发生什么情况?

用户名

我试图了解的结果

(*) . (+) 

在Haskell。我知道合成运算符只是数学函数的标准合成-所以

(f . g) = f (g x)

但:

(*) . (+) :: (Num (a -> a), Num a) => a -> (a -> a) -> a -> a

我正在努力理解这种类型的签名。我本来希望能够做到:

((*) . (+)) 1 2 :: Num a => a -> a
= (* (+ 1 2))

是什么意思 (*) 。(+)的类型签名?我尝试通过类似的方式(仅与其签名匹配)来玩:

((*) . (+)) 1 (\x -> x + 1) 1

但这无法编译。在编写这些代码时,我试图通过逻辑步骤,但我还没有完全理解它如何达到此结果(以及结果什么)。

阿迪特·沙

我理解你的感受。我一开始也发现功能组成也很难掌握。使我困惑的是类型签名。考虑:

(*) :: Num x => x -> x -> x
(+) :: Num y => y -> y -> y
(.) :: (b -> c) -> (a -> b) -> a -> c

现在,当您编写时,(*) . (+)它实际上与(.) (*) (+)(即(*)是的第一个参数(.)(+)是的第二个参数(.))相同:

(.) :: (b -> c) -> (a -> b) -> a -> c
       |______|    |______|
           |           |
          (*)         (+)

因此,(*)(即Num x => x -> x -> x的类型签名b -> c

(*) :: Num x => x -> x -> x -- remember that `x ->  x -> x`
                |    |____| -- is implicitly `x -> (x -> x)`
                |       |
                b ->    c

(.) (*) ::          (a -> b) -> a ->    c
                          |             |
                          |          |‾‾‾‾|
           Num x =>       x          x -> x

(.) (*) :: Num x => (a -> x) -> a -> x -> x

因此,(+)(即Num y => y -> y -> y的类型签名Num x => a -> x

(+) :: Num y => y -> y -> y -- remember that `y ->  y -> y`
                |    |____| -- is implicitly `y -> (y -> y)`
                |       |
       Num x => a ->    x

(.) (*) (+) ::  Num x                => a ->     x    ->    x
                                        |        |          |
                                        |     |‾‾‾‾|     |‾‾‾‾|
                              Num y  => y     y -> y     y -> y

(.) (*) (+) :: (Num (y -> y), Num y) => y -> (y -> y) -> y -> y

我希望可以弄清“Num (y -> y)和”的Num y来源。您会留下一个非常奇怪的type函数(Num (y -> y), Num y) => y -> (y -> y) -> y -> y

是什么使得它如此奇怪的是,它希望既yy -> y为实例Num可以理解y应该是的实例,这是可以理解Num,但是怎么做y -> y呢?制作y -> y的实例Num似乎不合逻辑。那是不正确的。

但是,当您查看实际的功能组合时,这才有意义:

( f  .  g ) = \z ->  f  ( g  z)

((*) . (+)) = \z -> (*) ((+) z)

所以你有一个功能\z -> (*) ((+) z)因此,z显然必须是Num因为(+)已应用了它的一个实例这样的类型\z -> (*) ((+) z)就是Num t => t -> ...其中...的类型(*) ((+) z),我们将在稍后发现。

因此((+) z)属于这种类型,Num t => t -> t因为它需要再加上一个数字。但是,在将其应用于另一个数字之前,(*)已对其应用。

因此(*)期望((+) z)是的实例Num,这就是为什么t -> t期望是的实例Num因此,...替换为,(t -> t) -> t -> tNum (t -> t)添加了约束,从而产生了type (Num (t -> t), Num t) => t -> (t -> t) -> t -> t

你真的想结合的方式(*),并(+)为使用(.:)

(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
f .: g = \x y -> f (g x y)

因此(*) .: (+)与相同\x y -> (*) ((+) x y)现在有两个论点可以(+)确保((+) x y)确实是正义的Num t => t和不正义的Num t => t -> t

因此((*) .: (+)) 2 3 5(*) ((+) 2 3) 5哪个是(*) 5 5哪个25,我相信这就是您想要的。

请注意,f .: g也可以写成(f .) . g(.:)也可以定义成(.:) = (.) . (.)你可以在这里读更多关于它的内容:

(f。)是做什么的。在Haskell中是什么意思?

希望能有所帮助。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果我的过程未定义变量,但在共享库中用作外部变量,会发生什么情况?

来自分类Dev

在Git中删除分支时会发生什么情况

来自分类Dev

将函数用作参数时会发生什么情况?

来自分类Dev

当我从RAM运行持久性存储实时USB时会发生什么情况?

来自分类Dev

当我离开INT_MAX以外时会发生什么情况?

来自分类Dev

将数组作为参数传递时会发生什么情况?

来自分类Dev

服务在调用stopSelf()后收到启动命令时会发生什么情况

来自分类Dev

不等待HttpClient使用时会发生什么情况

来自分类Dev

将可移动对象插入std :: set失败时会发生什么情况?

来自分类Dev

重复printf说明符标志时会发生什么情况?

来自分类Dev

应用程序在Cordova中退出时会发生什么情况?

来自分类Dev

使用类函数更改S4对象的“类”时会发生什么情况?

来自分类Dev

以Express应用程序作为参数评估require(“ http”)。Server()时会发生什么情况?

来自分类Dev

调用订阅的PayPal REST API执行URL时会发生什么情况

来自分类Dev

通过fcntl锁定位于远程存储上的文件时会发生什么情况?

来自分类Dev

将1Byte数据转换为4Byte时会发生什么情况

来自分类Dev

当线程进入Java中的同步块/方法时会发生什么情况

来自分类Dev

使用“ + =”在Java中“更改”字符串时会发生什么情况?

来自分类Dev

当您清除Android应用程序的存储空间时会发生什么情况

来自分类Dev

当我从RAM运行持久性存储实时USB时会发生什么情况?

来自分类Dev

将属性应用于python中的类方法时会发生什么情况?

来自分类Dev

VB.NET中的类型之间进行转换时会发生什么情况?

来自分类Dev

当我们将jar提交给风暴集群时会发生什么情况?

来自分类Dev

当不可充电的CMOS电池用尽时会发生什么情况?

来自分类Dev

我执行apt-get升级时会发生什么情况?

来自分类Dev

在C ++中将char连接到字符串时会发生什么情况?

来自分类Dev

实例化python类但未定义__init __()方法时会发生什么情况?

来自分类Dev

两次调用UItableview时会发生什么情况

来自分类Dev

调用dbcontext.Database.ExecuteSqlCommand时会发生什么情况?

Related 相关文章

  1. 1

    如果我的过程未定义变量,但在共享库中用作外部变量,会发生什么情况?

  2. 2

    在Git中删除分支时会发生什么情况

  3. 3

    将函数用作参数时会发生什么情况?

  4. 4

    当我从RAM运行持久性存储实时USB时会发生什么情况?

  5. 5

    当我离开INT_MAX以外时会发生什么情况?

  6. 6

    将数组作为参数传递时会发生什么情况?

  7. 7

    服务在调用stopSelf()后收到启动命令时会发生什么情况

  8. 8

    不等待HttpClient使用时会发生什么情况

  9. 9

    将可移动对象插入std :: set失败时会发生什么情况?

  10. 10

    重复printf说明符标志时会发生什么情况?

  11. 11

    应用程序在Cordova中退出时会发生什么情况?

  12. 12

    使用类函数更改S4对象的“类”时会发生什么情况?

  13. 13

    以Express应用程序作为参数评估require(“ http”)。Server()时会发生什么情况?

  14. 14

    调用订阅的PayPal REST API执行URL时会发生什么情况

  15. 15

    通过fcntl锁定位于远程存储上的文件时会发生什么情况?

  16. 16

    将1Byte数据转换为4Byte时会发生什么情况

  17. 17

    当线程进入Java中的同步块/方法时会发生什么情况

  18. 18

    使用“ + =”在Java中“更改”字符串时会发生什么情况?

  19. 19

    当您清除Android应用程序的存储空间时会发生什么情况

  20. 20

    当我从RAM运行持久性存储实时USB时会发生什么情况?

  21. 21

    将属性应用于python中的类方法时会发生什么情况?

  22. 22

    VB.NET中的类型之间进行转换时会发生什么情况?

  23. 23

    当我们将jar提交给风暴集群时会发生什么情况?

  24. 24

    当不可充电的CMOS电池用尽时会发生什么情况?

  25. 25

    我执行apt-get升级时会发生什么情况?

  26. 26

    在C ++中将char连接到字符串时会发生什么情况?

  27. 27

    实例化python类但未定义__init __()方法时会发生什么情况?

  28. 28

    两次调用UItableview时会发生什么情况

  29. 29

    调用dbcontext.Database.ExecuteSqlCommand时会发生什么情况?

热门标签

归档