0

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

类型也是?

space :: Char -> [Char]

由于使用 ++ 和 : 运算符的“解析错误”,我无法在末尾添加空格。

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

space :: Char -> [Char]
space = ++ ' '

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

4

2 回答 2

5

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

space :: Char -> [Char]
space = (:" ")

所以你离正确的解决方案不远了。(与.[Char]相同的是包含字符的字符串。)让我们先看看使用类似的函数来了解它的窍门。库中有一个名为 的函数,用于测试两个文件名或文件夹名是否代表同一事物。(这解决了 unix上与.String" "' 'equalFilePath :: FilePath -> FilePath -> BoolmydirMyDir

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",因为如果我写了any equalFilePath "MyBestFile.txt", 那么filter将尝试使用equalFilePath不带 , 的"MyBestFile.txt"函数,因为函数首先会吞噬它们的第一个参数。any :: (a -> Bool) -> [a] -> Bool

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

hasMyBestFile = any ("MyBestFile.txt" ==)

它也可以工作,因为 == 是一个常规函数。当您使用运算符函数执行此操作时,它称为运算符部分。

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

hasMyBestFile = any (== "MyBestFile.txt")

你可以用任何你喜欢的操作员来做:

hassmalls = any (< 5)

一个方便的列表运算符是:. :左边有一个元素,右边有一个列表,依次创建一个新的两个列表,所以'Y':"es"给你"Yes". (秘密地,"Yes"实际上只是'Y':'e':'s':[]因为:是一个构造函数/元素组合器的值的简写,但这在这里不相关。)使用:我们可以定义

space c = c:" "

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

space = (:" ")

希望现在对您更有意义。

于 2012-09-23T02:25:13.647 回答
4

你在这里想要的是一个operator 部分。为此,您需要用括号将应用程序括起来,即

space = (: " ")

这是语法糖

space = (\x -> x : " ")

(++)在这里不起作用,因为它需要一个字符串作为第一个参数,比较:

(:)  :: a -> [a] -> [a]
(++) :: [a] -> [a] -> [a]
于 2012-09-23T01:20:59.163 回答