繁体   English   中英

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

[英]Changing the order of arguments for function and list with flip in haskell

我有以下内容(从此处开始 ):

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

我正在尝试用更像这样的术语来重写它

applylike myfunction toList

而不是

applylike tolist myfunction

我了解可以使用flip函数更改参数顺序

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

翻转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不会失败,并且宇宙更有意义,下面的评论和接受的答案都对本次调查非常有帮助。

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

f $ x = f x

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

f a $ b

等同于:

f a b

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

f $ a b

等同于:

f (a b)

这是因为功能应用ab (即功能a应用参数b )具有在Haskell的优先级最高,没有什么能比绑定的功能应用更强大,包括$操作。

因此,您的首次尝试:

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

真的等于:

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

这显然不是您的意思。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM