我有以下内容(来自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
不会失败,并且宇宙更有意义,下面的评论和接受的答案都对本次调查非常有帮助。
答案 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]
显然不是您的意思。