【问题标题】:Got confused with point free style code对无点样式代码感到困惑
【发布时间】:2014-03-18 08:46:11
【问题描述】:

所以一个复制列表元素给定次数的函数看起来像这样

rep :: Int -> [a] -> [a]
rep = concatMap . replicate

根据定义(f . g) x = f(g(x)) 但是

(concatMap (replicate 4 "abc"))(concatMap . replicate) 4 "abc" 的工作方式不同。事实上,它根本不起作用。而concatMap的第一个参数必须是function。我对此感到困惑。那个免费版本是如何工作的?谁能解释一下。

【问题讨论】:

    标签: haskell pointfree


    【解决方案1】:

    (f . g) x = f (g x) 是对的,但这并不意味着(concatMap . replicate) 4 "abc" = concatMap (replicate 4 "abc")。相反,它意味着(concatMap . replicate) 4 "abc" = concatMap (replicate 4) "abc",这是真的。

    【讨论】:

    • 我想在提问之前我必须盯着类型签名更长的时间
    • replicate :: Int -> (a -> [a]), concatMap :: (a -> [b]) -> ([a] -> [b]) 因此,为了匹配它们的输入和输出,Haskell 首先应用了部分复制 1 参数。是这样吗?
    • @DulguunLst,不完全是。 Haskell 本身不应用任何东西。在这里工作的只是定义明确的应用程序规则。你刚刚写了replicate 返回(a -> [a]) 并且concatMap 接受(a -> [b])。这些类型是统一的(即假设b等于a),根据(.)的定义你得到一个Int -> ([a] -> [a])类型的函数,当然也就是Int -> [a] -> [a]的类型rep 在您的问题中。
    猜你喜欢
    • 2014-05-09
    • 2015-07-12
    • 2012-10-05
    • 1970-01-01
    • 2010-10-28
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多