Hyp*_*eus 13 haskell partial-application
我昨天开始使用haskell,但仍然完全迷失在这个勇敢的新世界的岸边.现在我遇到了以下问题:
让我们假设我有一些函数对整数和另一个变量做了一些魔术:
makeTuple :: Int -> a -> (Int, a)
makeTuple n x = (n, x)
Run Code Online (Sandbox Code Playgroud)
现在我想将此函数应用于列表的所有元素.到目前为止没问题,因为映射是你在python(我来自哪里)的日常面包和黄油.
makeTupleList :: Int -> [a] -> [ (Int, a) ]
makeTupleList n x = map (makeTuple n) x
Run Code Online (Sandbox Code Playgroud)
据我所知,二元函数makeTuple部分应用整数n,因此成为一元函数,可以映射到x的每个元素.到目前为止,一切都很好.
但是当makeTuple函数有另一个签名时我该怎么办,例如:
makeTuple2 :: a -> Int -> (Int, a)
makeTuple2 x n = (n, x)
Run Code Online (Sandbox Code Playgroud)
许多方式导致罗马:效果是一样的,但方式是另一种.现在显然映射不再起作用了:函数需要一个Int并获得一个.
makeTupleList2 :: Int -> [a] -> [ (Int, a) ]
makeTupleList2 n x = map (makeTuple2 n) x -- boolshit
Run Code Online (Sandbox Code Playgroud)
这是可以预料的.我的-maybe太pythonic- workaround正在使用另一个函数来传递它们应该去的参数:
makeTupleList2 :: Int -> [a] -> [ (Int, a) ]
makeTupleList2 n x = map (\x -> makeTuple2 x n) x
Run Code Online (Sandbox Code Playgroud)
问题: 当部分应用的参数不是最左边时,部分应用函数的首选函数,haskell样式是什么?
ham*_*mar 16
您可以使用flip,交换函数的第一个和第二个参数.
makeTupleList2 n x = map (flip makeTuple2 n) x
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用反引号语法来创建中缀运算符,然后使用运算符部分部分应用它.
maleTupleList2 n x = map (`makeTuple2` n) x
Run Code Online (Sandbox Code Playgroud)
或者,正如您所说,我们可以使用lambda表达式.使用哪一个取决于背景和个人品味.使用你认为最清楚的任何东西.
PS:你正在做什么叫做部分申请.Currying是将带有多个参数的函数转换(a, b) -> c为curry形式 的过程,a -> b -> c以便可以部分应用它.
| 归档时间: |
|
| 查看次数: |
2587 次 |
| 最近记录: |