gpt4 book ai didi

haskell - 使用列表的内容作为单个多参数函数的位置参数

转载 作者:行者123 更新时间:2023-12-02 12:09:19 25 4
gpt4 key购买 nike

是否有一个标准的 Haskell 函数(或模式)来提取列表的内容并将它们提供给函数,就像它们是函数的有序位置参数一样?

例如,考虑函数 (,),当给定两个位置参数时,它将根据它们生成一个二元组:

(,) 3 4 --> (3,4)

假设我有一些无法更改的外部函数调用给我的参数,表示为列表[3, 4]

是否有“内容”操作,这样就可以工作:

(,) $ contents_of [3, 4]

这样 contents_of 的操作就像函数应用程序一样将项目放置在源代码中(它们之间有空格)?

例如,(,) $contents_of [1] 应该是柯里化(Currying)函数 ((,) 1),然后它再需要一个参数来完成元组的创建.

我的一个想法是尝试将函数折叠到列表上,用折叠函数表达柯里化(Currying):

foldr (\x y -> y x) (,) [3, 4]

但查看 foldr 的类型签名:

foldr :: (a -> b -> b) -> b -> [a] -> b

让这看起来很困难。这里的 b 需要是函数类型本身,但是当它应用于参数时,它不会是与 b 具有相同类型签名的函数> 太长,会导致折叠中出现类型问题。

这在本质上与 Python *args 构造类似。

我不关心这可能暗示的严格性属性——只关心这样的事情在标准 Haskell 中是否可能。

最佳答案

可以像这样表示 N 元函数:

data FunN r a = FunN Int (a -> FunN r a) | FNil r

然后将普通函数转换为 FunN:

f2FunN :: (FunN (a->b) a) -> FunN b a
f2FunN (FNil g) = FunN 1 (FNil . g)
f2FunN (FunN n g) = FunN (n+1) (f2FunN . g)

然后应用参数列表:

a :: FunN b a -> [a] -> b
a (FNil r) [] = r
a (FunN _ f) (x:t) = a (f x) t
a _ _ = error "wrong arity"

例如:

Prelude> a (f2FunN $ f2FunN $ FNil (+)) [1,2]
3
Prelude> a (f2FunN $ FNil (+)) [1] 2
3
Prelude> a (f2FunN $ f2FunN $ FNil (+)) [1,2,3]
*** Exception: wrong arity
Prelude> a (f2FunN $ f2FunN $ FNil (+)) [1]
*** Exception: wrong arity

但是当然,您需要在编译时知道函数的数量 - 这样您就知道可以使用 f2FunN 包装该函数多少次。

关于haskell - 使用列表的内容作为单个多参数函数的位置参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26973648/

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