Function 算子的局部应用

Function 算子的局部应用,function,haskell,types,currying,partial-application,Function,Haskell,Types,Currying,Partial Application,如果我想在一个字符的末尾添加一个空格来返回一个列表,如果我不传递任何参数,我将如何使用部分应用程序来实现这一点 也会是什么类型 space :: Char -> [Char] 由于使用++和:运算符出现“解析错误”,我在末尾添加空格时遇到问题 到目前为止,我得到的是: space :: Char -> [Char] space = ++ ' ' 任何帮助都将不胜感激!谢谢您想要的是一个。为此,需要用括号括住应用程序,即 space = (: " ") 哪个是语法糖 space

如果我想在一个字符的末尾添加一个空格来返回一个列表,如果我不传递任何参数,我将如何使用部分应用程序来实现这一点

也会是什么类型

space :: Char -> [Char]
由于使用++和:运算符出现“解析错误”,我在末尾添加空格时遇到问题

到目前为止,我得到的是:

space :: Char -> [Char]
space = ++ ' '
任何帮助都将不胜感激!谢谢

您想要的是一个。为此,需要用括号括住应用程序,即

space = (: " ")
哪个是语法糖

space = (\x -> x : " ")
(++)
在这里不起作用,因为它需要一个字符串作为第一个参数,请比较:

(:)  :: a -> [a] -> [a]
(++) :: [a] -> [a] -> [a]

做你想做的事在Haskell中非常普遍,它有自己的语法,但作为Haskell,它非常轻量级。例如,这项工作:

space :: Char -> [Char]
space = (:" ")
所以你离正确的解决方案不远了。(
[Char]
String
是包含字符
的字符串)让我们先看看如何使用类似的函数来掌握它的窍门。库中有一个函数名为
equalFilePath::FilePath->FilePath->Bool
,用于测试两个文件名或文件夹名是否代表同一事物。(这解决了在unix上,
mydir
mydir
不同的问题,但在Windows上是一样的。)也许我想查看一个列表,看看它是否有我想要的文件:

isMyBestFile :: FilePath -> Bool
isMyBestFile fp = equalFilePath "MyBestFile.txt" fp
但是由于函数先吞掉它们的第一个参数,然后返回一个新函数来吞掉下一个参数,等等,我可以把它写得更短

isMyBestFile = equalFilePath "MyBestFile.txt"
这是因为
equalFilePath“MyBestFile.txt”
本身就是一个带有一个参数的函数:它的类型是
FilePath->Bool
。这是部分应用程序,非常有用。也许我不想麻烦编写一个单独的
isMyBestFile
函数,但想检查我的列表中是否有这样的函数:

hasMyBestFile :: [FilePath] -> Bool
hasMyBestFile fps = any (equalFilePath "MyBestFile.txt") fps
或者只是部分应用的版本:

hasMyBestFile = any (equalFilePath "MyBestFile.txt") 
请注意,我需要在
equalFilePath“MyBestFile.txt”
周围加上括号,因为如果我编写
任何equalFilePath“MyBestFile.txt”
,那么
过滤器将尝试只使用
equalFilePath
,而不使用
“MyBestFile.txt”
,因为函数首先会占用它们的第一个参数<代码>任何::(a->Bool)->[a]->Bool


现在有些函数是中缀运算符-从前后取其参数,如
==
你的意思是什么?对于某些输入,A是一个未定义的函数。如果您演示如何使用该函数,我认为这会很有帮助。是:
空格“Hello”--产生“Hello”
。如果您想使用这样的函数,签名应该是
space::[Char]->[Char]
。所以它根本不包含字符。嗨,我很难理解它背后的概念。如果可能的话,你能解释一下吗?@user1670032:对不起,我的第一个解决方案太复杂了(我把责任归咎于凌晨3点)。看看我发布的链接,这里有更多的例子。
space=(++)
绝对不是
Char->[Char]
@Sarah首先我删除了对
(++)
的所有引用,但现在我已经恢复了它(使用正确的类型!),因为我认为它可能更有用。
hasMyBestFile = any ("MyBestFile.txt" ==)
hasMyBestFile = any (== "MyBestFile.txt")
hassmalls = any (< 5)
space c = c:" "
space = (:" ")