【问题标题】:Haskell, trying to translate an input word from a given dictionaryHaskell,试图翻译给定字典中的输入词
【发布时间】:2017-10-12 01:18:27
【问题描述】:

嘿,我刚刚开始使用 Haskell,我正在尝试编写一个程序,通过读取包含一些翻译的 .txt 文件来翻译输入单词。在此之前,我编写了一个让用户输入翻译的程序。

import System.IO

main :: IO ()
main = do
  putStrLn "Type in an english word"
  d <- getLine
  if null d
      then return ()
      else do
            putStrLn "Type in a german translation"
            b <- getLine
            putStrLn (d ++ " means in german " ++ b)
            appendFile "woerterbuch.txt" (", " ++ d ++ " " ++ b)
            main

所以现在我得到了 woerterbuch.txt 文件,其中列出了如下所示的英语和德语单词:Hello Hallo,House Haus,等等。 我现在要做的是将这些单词放入元组中,这样如果用户输入英文单词,我就可以打印第二个(德语)单词。

import System.IO

    main :: IO()
    main = do
      putStrLn "Type in an english word"
      d <- getLine
      [contents] <- readFile "woerterbuch.txt"
      if d `elem` [contents]
          then do
            print contents
          else do
                  putStrLn "There's no translation available!"

这是我在多次尝试后想出的,我知道elem 用于列表,所以我需要一个替代我的 .txt 文件,然后尝试用 @ 输出元组的第二个单词987654324@ 命令。 因此,首先如何将翻译输入创建为元组,其次如何测试所询问的单词是否在此列表中,然后打印出它所属的元组的第二个元素。 任何帮助将不胜感激。

【问题讨论】:

    标签: haskell dictionary input tuples


    【解决方案1】:

    我知道 elem 是用于列表的,所以我需要一个替代方法

    您可以使用 Map.fromList 创建平衡树字典 - Data.Map。具体来说,

    import qualified Data.Map as Map 
    
    main = do
        contents <- readFile "woerterbuch.txt"
        let ls = lines contents
        let ws = fmap words ls
        let m = Map.fromList [(t!!0, t!!1) | t <- ws, length t == 2]           
        ...
    

    让您可以将m 用作字典。

    【讨论】:

    • 谢谢,但是每当我尝试翻译一个单词时,我都会遇到索引太大的异常。 “*** Exception: Prelude.!!: index too large” 我可能没有正确地实现你的代码,我应该把它放在什么地方?有没有办法用元组来做,所以我不需要!!索引?
    • 哦,它正在读取一些不包含元组的行(可能是结束行)。我会更新的。
    • 非常感谢,我知道了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多