gpt4 book ai didi

haskell - 为什么 zipWith.zipWith 有效?

转载 作者:行者123 更新时间:2023-12-01 23:03:27 24 4
gpt4 key购买 nike

我正在实现一个函数 combine::[[a]] -> [[b]] -> (a -> b -> c) -> [[c]] 它给出两个 2D 列表,将给定函数 f::a -> b -> c 应用于 2D 列表的条目。换句话说:

          [[a, b, c],    [[r, s, t],          [[f a r, f b s, f c t], 
combine [d, e, g], [u, v, w], f = [f d u, f e v, f g w],
[h, i, j]] [x, y, z]] [f h x, f i y, f j z]]

现在我怀疑 combine = zipWith 。 zipWith,因为我已经尝试过了,它给了我预期的结果,例如

(zipWith . zipWith) (\x y -> x+y) [[1,2,3],[4,5,6]] [[7,8,9],[10,11,12]]

给出了预期的结果[[8,10,12],[14,16,18]],但我不明白为什么会这样,因为我不明白压缩包。 zipWith 结果是 (a -> b -> c) -> [[a]] -> [[b]] -> [[c]]

这里的(.)是否还在进行通常的函数组合?如果是这样,你能解释一下这如何适用于 zipWith 吗?

最佳答案

推断表达式的类型,例如 zipWith 。 zipWith,你可以通过以下方式模拟你脑海中的统一。

第一个 zipWith 的类型为 (a -> b -> c) -> ([a] -> [b] -> [c]),第二个 (s -> t -> u) -> ([s] -> [t] -> [u])(.) 的类型为 (m -> n) -> (o -> m) -> (o -> n).

要进行类型检查,您需要:

  • m = (a -> b -> c)
  • n = ([a] -> [b] -> [c])
  • o = (s -> t -> u)
  • m = ([s] -> [t] -> [u]) => a = [s ], b = [t], c = [u] 因为第一个约束

那么返回的类型是 o -> n 也就是 (s -> t -> u) -> ([a] -> [b] -> [c]) 从约束中更进一步 (s -> t -> u) -> ([[s]] -> [[t]] -> [[u]]).

关于haskell - 为什么 zipWith.zipWith 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46619990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com