Ваша проблема в том, что english
смотрит только на первое слово.Ваш файл поступает как
"one\ntwo\nthree\nfour"
Затем words
превращает это в:
["one","two","three","four"]
Использование головы, которая дает вам:
"one"
И для этого 1
напечатано.
Instaid мы хотели бы использовать английский для всех слов.Именно тогда map
пригодится, но в этом случае мы отображаем действие ввода-вывода в список, поэтому мы хотим использовать mapM
.Кроме того, нас не интересует результат действия ввода-вывода (мы просто хотим, чтобы это действие произошло), поэтому мы используем 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
Обратите внимание, что можно написать это с помощью map
instaidиз mapM
, сначала сделав ["one","two","three",...]
в ["1","2","3"]
, объединяя эти строки, а затем используя putStrLn
, но описанный выше способ является и более коротким, и более идиоматическим.