运营商的部分应用

use*_*032 0 haskell types function currying partial-application

如果我想在字符末尾添加一个空格来返回一个列表,如果我没有传递任何参数,我将如何使用部分应用程序完成此操作?

这种类型也是?

space :: Char -> [Char]
Run Code Online (Sandbox Code Playgroud)

由于使用++和:运算符的'解析错误',我在最后添加空格时遇到了麻烦.

到目前为止我所拥有的是:

space :: Char -> [Char]
space = ++ ' '
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激!谢谢

And*_*ewC 5

做你想要的东西在Haskell中是如此常见,它有自己的语法,但作为Haskell,它非常轻巧.例如,这有效:

space :: Char -> [Char]
space = (:" ")
Run Code Online (Sandbox Code Playgroud)

所以你离开正确的解决方案并不遥远.([Char]String.相同" "是包含该字符的字符串' '.)让我们先看看使用类似的函数来获取它的悬念.库中有一个函数,equalFilePath :: FilePath -> FilePath -> Bool用于测试两个文件名或文件夹名称是否代表相同的东西.(这解决了unix上的问题,mydir不一样MyDir,但在Windows上它是.)也许我想检查一个列表,看看它是否有我想要的文件:

isMyBestFile :: FilePath -> Bool
isMyBestFile fp = equalFilePath "MyBestFile.txt" fp
Run Code Online (Sandbox Code Playgroud)

但是因为函数首先吞噬它们的第一个参数,然后返回一个新函数来吞噬下一个,等等,我可以把它写得更短

isMyBestFile = equalFilePath "MyBestFile.txt"
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为equalFilePath "MyBestFile.txt"它本身就是一个带有一个参数的函数:它的类型是FilePath -> Bool.这是部分应用,它非常有用.也许我不想打扰单独的isMyBestFile函数,但想检查我的列表是否有它:

hasMyBestFile :: [FilePath] -> Bool
hasMyBestFile fps = any (equalFilePath "MyBestFile.txt") fps
Run Code Online (Sandbox Code Playgroud)

或者只是部分应用的版本:

hasMyBestFile = any (equalFilePath "MyBestFile.txt") 
Run Code Online (Sandbox Code Playgroud)

注意我需要如何将括号括起来equalFilePath "MyBestFile.txt",因为如果我写了any equalFilePath "MyBestFile.txt",那么filter就会尝试使用equalFilePath不带"MyBestFile.txt",因为函数首先吞噬它们的第一个参数.any :: (a -> Bool) -> [a] -> Bool

现在一些函数是中缀运算符 - 从前后获取它们的参数,比如==<.在Haskell中,这些只是常规函数,而不是硬编码到编译器中(但是指定了优先级和关联性规则).如果我是一个从未听说过equalFilePath并且不关心它解决的可移植性问题的unix用户,那么我可能会想做什么

hasMyBestFile = any ("MyBestFile.txt" ==)
Run Code Online (Sandbox Code Playgroud)

它会工作,只是相同,因为==是一个常规函数.当您使用运算符函数执行此操作时,它称为运算符部分.

它可以在前面或后面工作:

hasMyBestFile = any (== "MyBestFile.txt")
Run Code Online (Sandbox Code Playgroud)

你可以和任何你喜欢的运营商一起做:

hassmalls = any (< 5)
Run Code Online (Sandbox Code Playgroud)

并且列表的方便操作符是:.:在左边是一个元素,在右边有一个列表,在两个之后创建一个新的列表,所以'Y':"es"给你"Yes".(暗地里,"Yes"实际上只是简写,'Y':'e':'s':[]因为它:是一个构造函数/元素组合值,但这里没有相关性.)使用:我们可以定义

space c = c:" "
Run Code Online (Sandbox Code Playgroud)

我们可以c像往常一样摆脱它

space = (:" ")
Run Code Online (Sandbox Code Playgroud)

希望现在对你更有意义.