我有一个简单的函数(实际上用于项目Euler的一些问题).它将数字列表转换为十进制数.
fromDigits :: [Int] -> Integer
fromDigits [x] = toInteger x
fromDigits (x:xs) = (toInteger x) * 10 ^ length xs + fromDigits xs
Run Code Online (Sandbox Code Playgroud)
我意识到这种类型[Int]并不理想.fromDigits应该能够采取其他输入,如序列,甚至可能foldables......
我的第一个想法是用"折叠状态"替换上面的代码.上述函数的正确(=最小)Haskell类别是什么?
我读过,map可以定义使用foldr,即它是一个原始的递归函数.至少对于名单.
现在我的问题:为什么Functor不是可折叠的子类型?如果fmap只能根据foldr列表来定义,那么它们的特殊性是什么?
查看mapfoldr 的定义:
myMap f xs = foldr step [] xs
where step x ys = f x : ys
Run Code Online (Sandbox Code Playgroud)
我可以使用Monoids来:
myMap f xs = foldr step mempty xs
where step x ys = f x : ys
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,我对Haskell魔术师来说还远远不够cons.
for是flip traverse。
forM是flip mapM。
依此类推for_,等等。
关于什么foldMap?很孤独。
flip foldMap = ?
可以foldr和foldl 彼此定义吗?
赫顿在Haskell编程说
我们需要手动定义什么?
Foldable该类实例的最小完整定义 是定义foldMap或foldr,因为可以使用默认定义和列表实例从这两个函数之一派生该类中的所有其他函数。
那么如何foldl 定义foldr呢?
可以foldr根据进行定义foldl,以便我们可以Foldable通过定义类型来定义类型foldl?
为什么在Foldable,fold在来定义foldMap这方面的定义foldr,而在列表可折叠,一些专业化fold来讲被定义foldl为:
maximum :: Ord a => [a] -> a
maximum = foldl max
minimum :: Ord a => [a] -> a
minimum = foldl min
sum :: Num a => [a] -> a
sum = foldl (+) 0
product :: …Run Code Online (Sandbox Code Playgroud)