Haskell 哈斯克尔-印刷数字
我编写了以下代码:Haskell 哈斯克尔-印刷数字,haskell,printing,Haskell,Printing,我编写了以下代码: module Test where import Char import IO main = do str <- readFile "no.txt" putStrLn (show(english str)) string2list :: String -> [String] string2list "" = [] string2list s = words s english :: String -> Int english s
module Test where
import Char
import IO
main = do
str <- readFile "no.txt"
putStrLn (show(english str))
string2list :: String -> [String]
string2list "" = []
string2list s = words s
english :: String -> Int
english s
| head (string2list s) == "one" = 1
| head (string2list s) == "two" = 2
| head (string2list s) == "three" = 3
| head (string2list s) == "four" = 4
| head (string2list s) == "five" = 5
| head (string2list s) == "six" = 6
| head (string2list s) == "seven" = 7
| head (string2list s) == "eight" = 8
| head (string2list s) == "nine" = 9
| otherwise = error "not match"
编译并运行代码后,我得到了以下结果:
1
但我希望得到:
1
2
3
4
...
代码怎么了?有什么帮助吗?谢谢
str
不是从readFile
读取时的字符串列表(它只是一个类似于one\ntwo
)的字符串。做
main = do
str <- readFile "no.txt"
mapM_ (\x -> putStrLn (show(english x))) $ lines str
main=do
str putStrLn(show(英文x))$lines str
在你的
main
中,使用行将str
转换成一个列表(参见文档)。这不是对你问题的回答,而是一个风格建议。通过使用模式匹配和用words
替换string2list
,您可以摆脱那些冗长的head(string2list s)
内容;两者的作用完全相同:
english s = case words s of
"one" :_ -> 1
"two" :_ -> 2
"three" :_ -> 3
"four" :_ -> 4
"five" :_ -> 5
"six" :_ -> 6
"seven" :_ -> 7
"eight" :_ -> 8
"nine" :_ -> 9
_ -> error "no match"
你的问题是英语
只看第一个单词。您的文件以
"one\ntwo\nthree\nfour"
然后words
将其转换为:
["one","two","three","four"]
正面朝上使用,可为您提供:
"one"
因此,打印1
Instaid我们希望在所有单词上使用英语。这就是map
进入的时候
方便,但在本例中,我们将IO操作映射到列表上,因此我们希望使用mapM
。此外,我们对IO操作的结果不感兴趣(我们只希望该操作发生),因此我们使用mapM
:
import Control.Monad
main = do
str <- readFile "no.txt"
mapM_ (print . english) (words str)
english "one" = 1
english "two" = 2
english "three" = 3
english "four" = 4
english "five" = 5
english "six" = 6
english "seven" = 7
english "eight" = 8
english "nine" = 9
import-Control.Monad
main=do
str只是一个提示:如果您希望您的程序处理输入中的每一行,您可以在某个地方将输入(当前只有一个长字符串值)转换为单独的行。这与您的问题无关,但单词“
是[]
,因此,您可以去掉string2list
,只需使用words
即可。您的代码可以工作,但我认为您关于his失败原因的评论是错误的,因为这是行的情况。单词==单词,他使用单词。我认为应该关注这样一个事实,即您正在将英语
映射到行列表中。在一个文体注释putStrLn上。show==print
。这也大大提高了性能(因为在原始解决方案中,单词会被重复评估,每个保护一次)。@Jonas此外,如果使用普通模式,GHC足够聪明,可以合并类似的情况。
import Control.Monad
main = do
str <- readFile "no.txt"
mapM_ (print . english) (words str)
english "one" = 1
english "two" = 2
english "three" = 3
english "four" = 4
english "five" = 5
english "six" = 6
english "seven" = 7
english "eight" = 8
english "nine" = 9