gpt4 book ai didi

haskell - 我不确定我是否理解 haskell 中 foldl 函数的类型定义

转载 作者:行者123 更新时间:2023-12-01 07:06:22 25 4
gpt4 key购买 nike

当我询问 foldl 类型时,我看到的是:

*Main> :t foldl
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b

在这种情况下, t a 是什么? ?

我猜这意味着该函数正在使用 Foldable参数化 a但我什至不确定语法。例如,为什么我不能替换 t aFoldable a ?

而且,额外的问题,如果我必须定义 foldl我自己,我会从基本情况开始
foldl f b [] = []

但是,如果基本情况需要一个列表,那么接受 Foldable 就没有多大意义了。 .我可以用作基本案例的“空折叠”是什么?

最佳答案

Foldable是一种叫做“类型类”的东西。说Foldable t =>声明 t必须执行 Foldable 的要求.但是,t遗骸 t , 并且不会折叠成对 Foldable 的引用像在 Java 中一样的接口(interface)。这就是为什么你不能只拥有 Foldable a .

一定要看看https://hackage.haskell.org/package/base-4.10.1.0/docs/Data-Foldable.html了解 Foldable 的要求以及什么方法可以帮助您。

无论如何,如果你想使用 Foldable 之一的方法,然后使用已知的 Foldable输入像 Set :

import qualified Data.Set as S
import Data.Foldable

sumSet :: (Num n) => S.Set n -> n
sumSet ns = foldl' (\ n acc -> n + acc ) 0 ns --make this pointfree if you want

或者您可以采用类型参数并将其约束为可折叠:
sumFld :: (Num n, Foldable f) => f n -> n --different signature
sumFld ns = foldl' (\ n acc -> n + acc ) 0 ns --same implementation!

以下打印 6,两次:
main :: IO ()
main = print (sumSet $ S.fromList [1, 2, 3]) >> print (sumFld $ S.fromList [1, 2, 3])

关于haskell - 我不确定我是否理解 haskell 中 foldl 函数的类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49036437/

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