你好我是Haskell的新手,我在尝试让这个脚本工作时遇到了问题。 此脚本从命令行读入参数,并在单独的文本文件中查找。
E.G:cat.txt | ./redact house big cat(编译器中)
它通过用星号( * *)星号替换它们来编辑文本文件中的某些单词。 每个编辑单词使用的星数应该等于 单词中的字符数。
module Main where
import System
import Data.Char
import Data.List
lowercase :: String -> String
lowercase = map toLower
main = do
arg1 <- getArgs
txt <- getContents
putStr (redact txt arg1)
redact :: String ->[String] -> String
redact input xWords = unlines [ work line | line <- lines input ]
where work line = unwords [ foo word | word <- words line ]
foo w | lowercase(w) == lowercase(xWords) = convertWord w 1
| otherwise = w
convertWord :: Eq a => [a] -> [a]
convertWord :: map (const '*')
然而,当我尝试编译它时,GHCi返回错误:“redact.hs:21:27:解析错误输入”'“。 所以代码:
convertWord :: map (const '*')
造成了这个问题。
最后当我输入:( cat.txt | ./redact house big cat)在编译器中我得到错误:“interactive:1:14:解析错误输入'|' “ 所以我也想要解决这个错误。
的信息: Windows 7的 GHCi编译器,版本7.0.4
答案 0 :(得分:2)
convertWord :: map (const '*')
应该是
convertWord = map (const '*')
使用::
提供类型注释。使用=
定义函数或变量。
同时,这个
cat.txt | ./redact house big cat
看起来应该是这个
type cat.txt | redact house big cat
直接输入dos提示符(命令提示符),不是在ghci中。 (我假设您要处理的文件名为cat.txt
。)
(您正在使用Windows,但您使用的教程似乎假设您使用的是Mac或Linux。)
答案 1 :(得分:1)
convertWord :: map (const '*')
::
运算符用于声明具有给定类型的内容。所以上面的一行是说“convertWord
具有类型map (const '*')
”,这显然没有任何意义。你可能想要=
那里。
cat.txt | ./redact house big cat
我不知道是谁告诉你把它写进GHCi,但这不是有效的Haskell代码。它是shell脚本 - 您需要将其键入(unix)shell。
答案 2 :(得分:0)
要提及的另一件事(除了::
应该是=
)是您为convertWord
提供的类型签名是错误的。
您提供的签名Eq a => [a] -> [a]
表明,对于支持相等的任何类型,convertWord
会将该类型的列表转换为另一个此类列表。因此,Int
的列表会被转换为Int
的另一个列表。这可能是正确的,因为'*'
不是Int
。
签名应该是什么?好吧,你显然想用它来将String
变成另一个String
,所以String -> String
肯定适用于这个例子。然而,convertWord
的最常规类型是[a] -> String
,您可以通过询问GHCi(输入:t map (const '*')
)或查看map :: (a -> b) -> [a] -> [b]
和{{的类型来查找1}}并看看它们是如何匹配的。