haskell - 组成 "length of sum"是什么意思?

标签 haskell types composition

我在玩 Haskell 的类型时无意中发现了 length 。总和 有效。是否有一些语义应该允许它工作,或者这仅仅是类型定义的一个缺点?我在下面编写了每个类型定义。

length :: Foldable t => t a -> Int
sum :: (Foldable t, Num a) => t a -> a
(.) :: (b -> c) -> (a -> b) -> a -> c
length . sum :: (Foldable t1, Foldable t2, Num (t1 a)) => t2 (t1 a) -> Int

我唯一能理解它的场景是将字符求和成一个字符串,然后您就可以得到该字符串的长度。但是,sum 只能接受可折叠类型的数字,因此无法正常工作。

最佳答案

这是一个简单的例子。

import Data.Functor.Identity

xs :: [Identity Int]
xs = map Identity [0..9]

result :: Int
result = length . sum $ xs

main :: IO ()
main = print result -- 1

让我们了解发生了什么。

  1. 首先,我们对xs 的所有元素求和。因此,sum xsIdentity 0 + ... + Identity 9,其计算结果为 Identity 45。请注意,Num a => Identity aNum 的实例。
  2. 接下来,我们找到sum xs 的长度。因此,长度。 sum $ xslength $ Identity 45,其计算结果为 1,因为在任何 Identity 数据结构中只有一个元素。

如果您查看 length 的签名,这是有道理的。求和

length . sum :: (Foldable g, Foldable f, Num (f a)) => g (f a) -> Int

首先,我们遍历g,找到g内所有f asumsum 的定义取决于类型f a。结果是 f a。然后,我们找到生成的 f alength

关于haskell - 组成 "length of sum"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59044451/

相关文章:

list - 比计算单位列表长度更好的方法

haskell - 无法编译 Haskell 程序 ("Couldn' t 匹配“错误)

types - Ada 中的多类型继承

scala - 在 ScalaTest 中组合测试装置的更好方法

haskell - 我可以让 readProcess 去掉引号吗?

list - Haskell 将元组列表映射到元组列表

c - 为枚举分配类型是标准 C 语言吗?

types - NSCoder 和自定义类型

c++ - 关于何时调用嵌入对象的复制构造函数的困惑

java - 关于继承的Java类的性质的问题