使用Haskell中的Flip更改函数和列表的参数顺序

时间:2019-04-25 17:16:55

标签: haskell

我有以下内容(来自here):

for_ [1..10] $ (\x -> T.putStrLn $ T.pack $ show x )

我正试图用更像这样的术语来重写

applylike myfunction toList

而不是

applylike tolist myfunction

我了解flip function can be employed to change argument order

flip :: (a -> b -> c) -> b -> a -> c
     

flip f以相反的顺序获取其(第一个)两个参数。

>>> flip (++) "hello" "world"
"worldhello"

这是我的原始作品:

import Data.Foldable (for_)

:t flip
-- 1
for_ [1..10] $ (\x -> T.putStrLn $ T.pack $ show x )
-- success

但是当我尝试直接应用它时,此操作将失败:

-- 2
flip for_ $ (\x -> T.putStrLn $ T.pack $ show x ) [1..10] 
-- fail

但是,我注意到,如果删除(1)中所需的$运算符,它将成功:

-- 3
flip for_ (\x -> T.putStrLn $ T.pack $ show x ) [1..10] 
-- success

但是我不明白为什么扫描正确。当我从原始非翻转版本(1)中删除$运算符时,该操作也会失败。

-- 4    
for_ [1..10] (\x -> T.putStrLn $ T.pack $ show x )
-- fail

如何解析这些内容,以致$在(1)中是必需的,而在(3)中则不存在?

更新

道歉:以上4确实成功。在调查此事时,我一定有错别字,这无疑使我更加困惑。对于将来的读者来说,4不会失败,并且宇宙更有意义,下面的评论和接受的答案都对本次调查非常有帮助。

1 个答案:

答案 0 :(得分:4)

因为这就是$运算符的工作方式。该运算符不是Haskell语法的一部分,而是其他任何常规的用户定义运算符。定义如下:

f $ x = f x

因此,如果您编写如下内容:

f a $ b

与以下相同:

f a b

但是,如果您编写如下内容:

f $ a b

与以下相同:

f (a b)

这是因为函数应用程序a b(即应用于参数a的函数b)在Haskell中具有最高的优先级,没有什么可以比函数应用程序更强大的绑定了,包括{{ 1}}运算符。

因此,您的第一次尝试:

$

实际上等于:

flip for_ $ (\x -> T.putStrLn $ T.pack $ show x ) [1..10] 

显然不是您的意思。