【发布时间】:2017-07-03 12:26:27
【问题描述】:
我正在学习haskell,并试图理解泛化在函数式编程中的含义。
考虑跟随代码sn-p:
twiceLifted :: (Functor f1, Functor f) =>
f (f1 a) -> f (f1 Char)
twiceLifted = (fmap . fmap) replaceWithP
twiceLifted' :: [Maybe String] -> [Maybe Char]
twiceLifted' = twiceLifted
如您所见,第一个函数没有具体类型,必须实现函子。
第二个函数看起来更有趣。它重用了第一个函数,但它有一个具体的类型。
因此,第一个功能为第二个功能奠定了基础。
这就是函数式编程中的泛化,重用已经存在的东西并在其之上构建吗?
【问题讨论】:
-
twiceLifted'仅具有具体类型,因为它是使用该类型声明的。如果您删除类型声明,它将与twiceLifted一样通用。 -
这是在 System F 中思考的情况,具有显式的 big-lambda 抽象和类型应用程序会使其更简单。类型推断有时有点太神奇了,因为它可以为我们实例化很多类型变量,有时使过程难以遵循。
标签: haskell functional-programming