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 = (:" ")