如果我想在字符末尾添加一个空格以返回一个列表,如果我不传递任何参数,我将如何使用部分应用程序来完成此操作?
类型也是?
space :: Char -> [Char]
由于使用 ++ 和 : 运算符的“解析错误”,我无法在末尾添加空格。
到目前为止,我所拥有的是:
space :: Char -> [Char]
space = ++ ' '
任何帮助将非常感激!谢谢
如果我想在字符末尾添加一个空格以返回一个列表,如果我不传递任何参数,我将如何使用部分应用程序来完成此操作?
类型也是?
space :: Char -> [Char]
由于使用 ++ 和 : 运算符的“解析错误”,我无法在末尾添加空格。
到目前为止,我所拥有的是:
space :: Char -> [Char]
space = ++ ' '
任何帮助将非常感激!谢谢
做你想做的事在 Haskell 中很常见,它有自己的语法,但作为 Haskell,它非常轻量级。例如,这有效:
space :: Char -> [Char]
space = (:" ")
所以你离正确的解决方案不远了。(与.[Char]
相同的是包含字符的字符串。)让我们先看看使用类似的函数来了解它的窍门。库中有一个名为 的函数,用于测试两个文件名或文件夹名是否代表同一事物。(这解决了 unix上与.String
" "
' '
equalFilePath :: FilePath -> FilePath -> Bool
mydir
MyDir
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 = (:" ")
希望现在对您更有意义。
你在这里想要的是一个operator 部分。为此,您需要用括号将应用程序括起来,即
space = (: " ")
这是语法糖
space = (\x -> x : " ")
(++)
在这里不起作用,因为它需要一个字符串作为第一个参数,比较:
(:) :: a -> [a] -> [a]
(++) :: [a] -> [a] -> [a]