[英]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.