代码之家  ›  专栏  ›  技术社区  ›  karambit

高阶函数

  •  2
  • karambit  · 技术社区  · 10 年前

    我试图从这里的指南中了解更高阶函数 http://learnyouahaskell.com/higher-order-functions 。但我有点困惑,希望有人能为我澄清一些事情。

    所以我看这个例子:

    applyTwice :: (a -> a) -> a -> a  
    applyTwice f x = f (f x)  
    

    好的,所以 applyTwice 是一个接受两个参数的函数,一个接受类型 a 和返回类型 ,第二个参数是类型 。函数返回一个类型 .

    在命令行中,我们得到以下结果:

    ghci> applyTwice (++ " HAHA") "HEY"  
    "HEY HAHA HAHA" 
    

    所以函数 f (++) 其类型为 [a] -> [a] -> [a] . (++ " HAHA") 部分申请正确吗?我们只给了它一个参数,因此它返回 [a] -> [a] . 在 应用两次 定义,我想从 (f x) 部分所以f取“HEY”,这产生“HEY HAHA”,这是类型 ,然后我需要申请 f 得到“呵呵呵呵”

    编辑: 以下两个例子: (++“哈哈”) ("HAHA " ++)

    ghci> applyTwice (++ " HAHA") "HEY"  
    "HEY HAHA HAHA"  
    
    ghci> applyTwice ("HAHA " ++) "HEY"  
    "HAHA HAHA HEY" 
    
    3 回复  |  直到 10 年前
        1
  •  4
  •   Chad Gilbert    10 年前

    两者之间的区别 (++ " HAHA") ("HAHA " ++) 与参数传入的顺序有关。如果我们显式使用lambdas,表达式如下所示:

    (++ " HAHA") == (\x -> x ++ " HAHA") -- expands to: "HEY" ++ " HAHA"
    ("HAHA " ++) == (\x -> "HAHA " ++ x) -- expands to: "HAHA " ++ "HEY"
    
        2
  •  3
  •   Code-Apprentice    10 年前

    两者的区别是什么 (++ " HAHA") ("HAHA " ++) ?

    (++“哈哈”) 给予 " HAHA" 作为第二个参数 (++) 作用

    (“哈哈”++) 给予 "HAHA " 作为 (++) 作用

        3
  •  3
  •   Ctx    10 年前

    (++ "HAHA") 与相同 (\x -> x ++ "HAHA")

    鉴于

    ("HAHA" ++) 等于 (\x -> "HAHA" ++ x)

    这一点从您的测试中也很明显。此语法称为 部分 并且使得(非交换)二进制运算符的部分应用更容易和更直观。

    推荐文章