haskell - 为什么使用组合运算符可以避免显式引用初始参数的需要?

标签 haskell functional-programming

我似乎无法理解为什么下面的代码无法编译:

decode :: [Bit] -> String
decode xs = map  (chr . bin2int) . (chop8 xs)

但是下面会:

decode :: [Bit] -> String
decode = map  (chr . bin2int) . chop8 

当我们给第二个函数一个列表时,它对其应用 chop8,然后将 (chr.bin2int) 映射到生成的列表中的元素。

那么为什么第一个例子不这样做呢?我们不是在有效地做同样的事情,只是在函数定义中给 chop8 参数吗?

谢谢

最佳答案

(.) 的定义是这里的关键。

举一个更简单的例子:

decode1, decode2 :: Int -> Char
decode1 x = chr . (abs x)
decode2 = chr . abs

现在,(.) 的定义是 f 。 g =\a -> f (g a),所以我们可以在我们的两个定义中使用它:

decode1 x = \a -> chr (abs x a)
decode2 = \x -> chr (abs x)

我们可以通过将 lambda 参数移动到模式匹配中来进一步简化它:

decode1 x a = chr (abs x a)
decode2 x = chr (abs x)

显然 decode2 是正确的函数; decode1 甚至不进行类型检查。 abs 只接受一个参数,但是 decode1 用 2 调用它!此外,decode1 有一个我们不需要的额外参数 a

关于haskell - 为什么使用组合运算符可以避免显式引用初始参数的需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56655146/

相关文章:

functional-programming - Scheme 的 "define"原语是命令式语言功能吗?为什么或者为什么不?

function - 我什么时候应该使用函数与方法?

haskell - 为什么 (Num a, Ord a) => a

haskell - 测试数据类型的规范方法

c - 每次执行指令时,如何编写一条指令将两个值切换到一个变量中?

python - 递归闭包(函数发生器)

javascript - 关于 jQuery 中匿名函数的问题

haskell - 打印所有可能的世界配置

forms - 向 Yesod 表单添加样式

haskell - Haskell 解释器/w 类型定义