gpt4 book ai didi

haskell - 获取 haskell 中的所有函数参数作为列表

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

haskell 有没有办法以列表的形式获取所有函数参数。

假设我们有以下程序,我们想要将两个较小的数字相加,然后减去最大的数字。假设,我们无法更改 foo::Int -> Int -> Int -> Int 的函数定义。除了构造一个新列表并将所有参数添加为该列表的元素之外,是否有一种方法可以将所有函数参数作为列表获取?更重要的是,是否有一种独立于参数数量的通用方法?

示例:

module Foo where
import Data.List

foo :: Int -> Int -> Int -> Int
foo a b c = result!!0 + result!!1 - result!!2 where result = sort ([a, b, c])

最佳答案

is there a general way of doing this independent of the number of arguments?

并非如此;至少这是不值得的。首先,整个想法并不是很有用,因为列表是同质的:所有元素必须具有相同的类型,因此它仅适用于仅接受单个参数的函数的相当不寻常的特殊情况类型。

即便如此,问题是“参数数量”在 Haskell 中并不是一个真正明智的概念,因为正如 Willem Van Onsem 评论的那样,所有函数实际上只有一个参数(更多参数是实际上只给出第一个应用程序的结果,它又具有函数类型)。

也就是说,至少对于单个参数和最终结果类型,将任意数量的参数打包到列表中是相当容易的:

{-# LANGUAGE FlexibleInstances         #-}

class UsingList f where
usingList :: ([Int] -> Int) -> f

instance UsingList Int where
usingList f = f []

instance UsingList r => UsingList (Int -> r) where
usingList f a = usingList (f . (a:))

foo :: Int -> Int -> Int -> Int
foo = usingList $ (\[α,β,γ] -> α + β - γ) . sort

使用类型族或多参数类型类也可以使此方法适用于任何类型的参数。但不那么简单的是用最终结果的变量类型一次性编写它。原因是,还必须处理函数作为最终结果的类型。但是,这也可以解释为“我们仍然需要在列表中添加一个参数”!

关于haskell - 获取 haskell 中的所有函数参数作为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48949277/

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