Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在haskell中使用flip更改函数和列表的参数顺序_Haskell - Fatal编程技术网

在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级绑定。