【问题标题】:Tuple mapping in HaskellHaskell 中的元组映射
【发布时间】:2012-09-08 08:12:35
【问题描述】:

我不知道它通常怎么称呼,但我需要的是这样的:

f a b c = a + 2 * b + 3 * c

map f [(1,2,3), (4,5,6), (7,8,9)]

即将 n 元组列表映射到具有 n 个单独参数的函数。 Haskell 中有内置的方法吗?

P.S.:我刚刚找到了uncurry,但它似乎不适用于 3 个参数,只有 2 个。

【问题讨论】:

  • 您的 f 不采用单个 3 元组参数的任何原因?否则,您可以在调用中创建自己的函数来进行“转换”:threeArgApply f (x,y,z) = f x y z

标签: haskell map tuples


【解决方案1】:

您可以定义自己的函数:

uncurry3 :: (a -> b -> c -> d) -> (a,b,c) -> d
uncurry3 f (a,b,c) = f a b c

map (uncurry3 f) [(1,2,3), (4,5,6), (7,8,9)]

或者,您可以使用 tuple 包中的 uncurryN,它适用于最大 15 的元组:

cabal install tuple

import Data.Tuple.Curry

map (uncurryN f) [(1,2,3), (4,5,6), (7,8,9)]

【讨论】:

  • 谢谢,使用了uncurryN 函数。为什么不在标准库中?..
  • 我很乐意提供帮助。我认为它不在标准库中,因为它并不经常需要,而且它使用了一些 GHC 扩展。
【解决方案2】:

我不知道这个问题的任何一般解决方案,但实际的解决方案是

uncurry3 f (x, y, z)  =  f x y z

然后

map (uncurry3 f) [(1,2,3), (4,5,6), (7,8,9)]

【讨论】:

    【解决方案3】:

    一般来说,不会 - 因为元组不像列表那么通用,并且可能有不同的数据类型

    但是,您可以以 ((a,b), c) 的方式重新处理您的元组,然后您可能想要使用 fst/snd 组合或 Arrows 来概括您的计算。

    【讨论】:

    • 我认为这不是真的。想象一个函数f :: a -> b -> c -> d,然后将它“应用”到(a,b,c) 类型的元组是完全可以的。 (无论如何,((a,b),c)(a,b,c) 之间没有根本区别,除了第一个允许您使用 uncurry (uncurry f) 而不必执行其他人提出的解决方案之一。)
    • 是的,我知道,我只是试图展示解决任务的不同方法,这可能会导致代码简洁明了,尤其是使用 Awrows。
    猜你喜欢
    • 2012-04-01
    • 1970-01-01
    • 2016-07-31
    • 2012-07-24
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多