gpt4 book ai didi

function - Haskell 有可变参数函数/元组吗?

转载 作者:行者123 更新时间:2023-12-02 18:29:36 24 4
gpt4 key购买 nike

uncurry 函数仅适用于带有两个参数的函数:

uncurry :: (a -> b -> c) -> (a, b) -> c

如果我想使用任意数量的参数来对函数进行柯里化(Currying),我可以编写单独的函数:

uncurry2 f (a, b)          = f a b
uncurry3 f (a, b, c) = f a b c
uncurry4 f (a, b, c, d) = f a b c d
uncurry5 f (a, b, c, d, e) = f a b c d e

但这很快就会变得乏味。有什么方法可以概括这一点,这样我只需要编写一个函数吗?

最佳答案

尝试uncurryN来自tuple包裹。与所有形式的重载一样,它是使用类型类来实现的。在本例中,通过手动拼出最多 15 个元组的实例,这应该足够了。

可变参数函数也可以使用类型类。其中一个例子是 Text.Printf 。在这种情况下,它是通过函数类型的结构归纳来完成的。简单来说,它的工作原理如下:

class Foo t

instance Foo (IO a)
instance Foo b => Foo (a -> b)

foo :: Foo

不难看出 foo 可以实例化为 IO aa -> IO ba -> b -> IO c 等等。 QuickCheck也使用了这种技术。

但是,结构归纳法不适用于元组,因为 n 元组与 n+1 元组完全无关,因此这就是为什么实例具有需要手动拼写出来。

关于function - Haskell 有可变参数函数/元组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7220953/

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