有人可以解释((.)$(.))(==)1(1+)0的含义

Sen*_*agi 7 syntax haskell pointfree

haskell.org上,我遇到了这个自由风格的功能,被称为"猫头鹰".

((.)$(.))
Run Code Online (Sandbox Code Playgroud)

它的类型签名是 (a -> b -> c) -> a -> (a1 -> b) -> a1 -> c.

这相当于 f a b c d = a b (c d) 并且显然是 ((.)$(.)) (==) 1 (1+) 0 回报True.

所以我的问题是:

  1. 什么是a1在类型签名是什么意思?它与a?有关吗?
  2. (==)某种函数相等运算符?因为0 (==) 0在GHCi中抛出错误.
  3. 1 (1+) 0在这种情况下意味着什么?我不知道这甚至是一个有效的表达方式.
  4. 为什么表达式会返回True

J. *_*son 15

  1. a1是"只是另一种类型变量".它可能意味着什么,包括a但不一定意味着什么.最有可能的是它与...不同a.

  2. (==)是类型类==的正则相等运算符的"强制前缀"形式Eq.通常你会写a == b,但这只是语法糖(==) a b,前缀应用程序==.

  3. 1 (1+) 0 在这种情况下,并不意味着任何特别的东西,三个子表达式中的每一个都是"猫头鹰"的独立论证,最终需要四个论点.

  4. 我们可以逐步减少.

    ((.)$(.)) (==) 1 (1+) 0
    ===                          [ apply ]
    ((.)(.)) (==) 1 (1+) 0
    ===                          [ implicit association ]
    ((.)(.)(==)) 1 (1+) 0
    ===                          [ apply the definition: (f.g) x = f (g x) ]
    ((.) (1 ==)) (1+) 0
    ===                          [ implicit association ]
    ((.) (1 ==) (1+))  0
    ===                          [ apply the definition: (f.g) x = f (g x) ]
    1 == (1+0)
    ===                          [addition]
    1 == 1
    ===                          [equality]
    True
    
    Run Code Online (Sandbox Code Playgroud)

本页所述,猫头鹰相当于一个功能f

f a b c d = a b (c d)
Run Code Online (Sandbox Code Playgroud)

也就是说它将第一个参数(两个参数的函数)应用于其第二个参数以及将其第三个参数应用于其第四个参数的结果.对于给出的实例中((.)$(.)) (==) 1 (1+) 0,这意味着你首先申请(+1)0,然后再结合1(1+0)使用(==)这是我们减少发生了什么事.

更广泛地说,您可能会将其视为一个修改二进制操作a以对其第二个参数稍加变化的函数.

  • 尼特:`(==)1`是`(1 ==)`,而不是`(== 1)`.并不重要的是`==`的默认定义,尽管...... (2认同)