在haskell中使用flip更改函数和列表的参数顺序
本人有以下资料: 我试着用更类似于在haskell中使用flip更改函数和列表的参数顺序,haskell,Haskell,本人有以下资料: 我试着用更类似于 applylike myfunction toList 而不是 applylike tolist myfunction 我理解: flip f的前两个参数的顺序与f相反 >>> flip (++) "hello" "world" "worldhello" 这是我的原创作品: import Data.Foldable (for_) :t flip -- 1 for_ [1..10] $ (\x -> T.putStrLn $ T.
applylike myfunction toList
而不是
applylike tolist myfunction
我理解:
flip f的前两个参数的顺序与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中所需的$operator,它将成功:
-- 3
flip for_ (\x -> T.putStrLn $ T.pack $ show x ) [1..10]
-- success
但我不明白为什么扫描正确。当我从原始的非翻转版本1中删除$operator时,也会失败
-- 4
for_ [1..10] (\x -> T.putStrLn $ T.pack $ show x )
-- fail
如何解析$在1中需要,在3中不需要
使现代化
道歉:以上4项确实成功。我在调查这件事的时候一定是打错了字,这无疑增加了我的困惑。对于未来的读者来说,4不会失败,宇宙更有意义,下面接受的评论和答案对本次调查非常有帮助。因为$operator就是这样工作的。此运算符不是Haskell语法的一部分,而是一个常规的用户定义运算符,与其他运算符一样。它的定义如下:
f $ x = f x
因此,如果你写了如下内容:
f a $ b
f $ a b
这与:
f a b
f (a b)
但是如果你写了这样的东西:
f a $ b
f $ a b
这与:
f a b
f (a b)
这是因为函数应用程序AB,即应用于参数b的函数a在Haskell中具有最高的优先级,没有比函数应用程序(包括$运算符)更强大的绑定
因此,您的第一次尝试:
flip for_ $ (\x -> T.putStrLn $ T.pack $ show x ) [1..10]
实际上相当于:
flip for_ ( (\x -> T.putStrLn $ T.pack $ show x ) [1..10] )
这显然不是你的意思。因为$operator就是这样工作的。此运算符不是Haskell语法的一部分,而是一个常规的用户定义运算符,与其他运算符一样。它的定义如下:
f $ x = f x
因此,如果你写了如下内容:
f a $ b
f $ a b
这与:
f a b
f (a b)
但是如果你写了这样的东西:
f a $ b
f $ a b
这与:
f a b
f (a b)
这是因为函数应用程序AB,即应用于参数b的函数a在Haskell中具有最高的优先级,没有比函数应用程序(包括$运算符)更强大的绑定
因此,您的第一次尝试:
flip for_ $ (\x -> T.putStrLn $ T.pack $ show x ) [1..10]
实际上相当于:
flip for_ ( (\x -> T.putStrLn $ T.pack $ show x ) [1..10] )
这显然不是你的意思。你不是只想要特拉弗斯吗,我可能想这样做,但我也想了解这里函数应用程序的顺序发生了什么。4怎么会失败?这里很好用。非常彻底的调查!案例4成功了。谢谢,我已经添加了一个更新说明。你不是只想要traverse吗,我可能想这样做,但我也想了解这里函数应用程序的顺序发生了什么。4怎么会失败?这里很好用。非常彻底的调查!案例4成功了。谢谢,我添加了一个更新说明。旁注$实际上绑定了最弱的:*Main>:I$表示infixr 0$即级别0,而功能应用程序即空间绑定了级别10。旁注$实际上绑定了最弱的:*Main>:I$表示infixr 0$即级别0,而功能应用程序(即空间)在10级绑定。