我似乎无法理解为什么下面的代码无法编译:
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/