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