在haskell中点自由风格

时间:2014-02-26 09:59:16

标签: haskell pointfree

我正在尝试更改

function (x:xs) = unwords (map reverse (words (x:xs)))

点自由风格,我不能这样做。

不是简单的

function = unwords . map . reverse . words

请帮助我将此更改为免费样式。

我在下面的命令行

之后尝试使用了pointfree
cabal install pointfree

所有编译和安装的东西,但是当我在终端中键入pointfree时,它一直说没有这样的东西。

2 个答案:

答案 0 :(得分:8)

你的定义几乎是正确的,可以在ghci解释器中测试,它应该是

ghci> let function = unwords . map reverse . words
ghci> function "The quick brown fox"
"ehT kciuq nworb xof"

因为reverse是map的参数。基本上,要将类似管道的函数foo a3 = f a1 (g a2 (h a3))(由嵌套函数调用组成)更改为pointfree,其中显式参数(在本例中为a3)是最后一次调用,您需要删除它并替换嵌套带.合成运算符的括号:foo = f a1 . g a2 . h。但是,当有多个参数或参数被多次使用时,此技巧不起作用。要明确地使用无点函数进行操作,您应该理解 combinatory logic

编辑:哦,我知道您尝试使用the command-line pointfree tool自动转换函数。使用cabal编译的二进制文件放在特定目录中(例如,Windows中的C:\ Users \ Username \ AppData \ Roaming \ cabal \ bin,AFAIR),默认情况下可能没有添加到PATH,因此命令行解释器可以'找到可执行文件。

答案 1 :(得分:2)

reversemap的参数,因此您无需使用map撰写reverse,但您想要撰写完整的map reverse与其他功能。

正确的方法是:

function = unwords . map reverse . words