【问题标题】:Haskell: a case of compositionHaskell:组合案例
【发布时间】:2017-12-20 14:32:03
【问题描述】:

这是通过foldl 连接的无用案例,纯属教育(对我而言):

foldl (\xs x -> xs ++ [x]) [1,2] [11,12,13]
[1,2,11,12,13]

有没有办法使用组合而不是 lambda 更紧密地打包它?

【问题讨论】:

  • foldl ((. return) . (++))。但最好使用flip (foldr (:))
  • 谢谢!那么多 foldr 我已经想通了 :) 。我一直在摸索。
  • 如果您关心性能,请知道foldl 通常效率很低。 foldl' 更好,但仅应在结果类型较小时使用(例如单个 Int)。 foldr 也可以,前提是折叠函数是非严格的。
  • @WillemVanOnsem 如果我们仍然要使用(++),我们可以将foldl (\xs x -> ...) 替换为(++),避免折叠。
  • 谢谢,但不,我不在乎效率。只是涂鸦,我正在学习。

标签: haskell function-composition


【解决方案1】:

这只是HTNWWill Ness 从 cmets 中提取的更易读的摘要:

-- Reduction to poinfree
a = \xs x -> xs ++ [x]
b = \xs x -> xs ++ return x
c = \xs x -> ((xs ++) . return) x
d = \xs x -> ((. return) (xs ++)) x
e = \xs x -> ((. return) . (++)) xs x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2018-10-11
    相关资源
    最近更新 更多