我昨天从 haskell 开始,仍然完全迷失在这个勇敢的新世界的岸边。现在我遇到了以下问题:
假设我有一些函数对整数和另一个变量有一些魔力:
makeTuple :: Int -> a -> (Int, a)
makeTuple n x = (n, x)
现在我想将此函数应用于列表的所有元素。到目前为止没问题,因为映射也是你在 python 中的日常面包和黄油(我来自哪里)。
makeTupleList :: Int -> [a] -> [ (Int, a) ]
makeTupleList n x = map (makeTuple n) x
据我了解,二元函数 makeTuple 部分与整数 n 一起应用,因此成为一个可以映射到 x 的每个元素的一元函数。到目前为止,一切都很好。
但是当 makeTuple 函数有另一个签名时我该怎么办,比如:
makeTuple2 :: a -> Int -> (Int, a)
makeTuple2 x n = (n, x)
通向罗马的方式很多:效果相同,但方式不同。现在显然映射不再起作用了:该函数需要一个 Int 并得到一个 a。
makeTupleList2 :: Int -> [a] -> [ (Int, a) ]
makeTupleList2 n x = map (makeTuple2 n) x -- boolshit
这是意料之中的。我的-也许太pythonic-解决方法是使用另一个函数将参数传递到它们应该去的地方:
makeTupleList2 :: Int -> [a] -> [ (Int, a) ]
makeTupleList2 n x = map (\x -> makeTuple2 x n) x
问题: 当部分应用的参数不是最左边时,首选的函数式、haskell 风格的部分应用函数的方式是什么?