坚持Haskell的模块输出

时间:2014-02-20 17:49:37

标签: haskell module io

我正在编写生成框图的编程代码。我正在尝试将我的代码拆分为模块(函数)。第一个模块生成框图。其他模块要求输入块的名称并将其保存为字符串(行),但它不允许将这些字符串导出到其他模块(我想将这些字符串导出为变量并在其他模块中使用块的名称)。可能有什么问题?也许有人已经发现同样的问题,并有解决方案?先感谢您! Input.hs代码:

   module Input (firstName, secondName, thirdName, fourthName) where 

   import Data.Char 

   main = do  
      putStrLn "Iveskite pirmo bloko pavadinima"  
      firstName <- getLine  
      putStrLn "Iveskite antro bloko pavadinima"  
      secondName <- getLine 
      putStrLn "Iveskite trecio bloko pavadinima"  
      thirdName <- getLine 
      putStrLn "Iveskite ketvirto bloko pavadinima"  
      fourthName <- getLine     

2 个答案:

答案 0 :(得分:5)

从具有module Input (firstName, secondName, thirdName, fourthName) where的模块导出名称时,必须在顶级定义这些名称,因此必须静态绑定。你可以做类似的事情

module Input (getNames) where

import Data.Char

getNames :: IO (String, String, String, String)
getNames = do
    putStrLn "Iveskite pirmo bloko pavadinima"  
    firstName <- getLine  
    putStrLn "Iveskite antro bloko pavadinima"  
    secondName <- getLine 
    putStrLn "Iveskite trecio bloko pavadinima"  
    thirdName <- getLine 
    putStrLn "Iveskite ketvirto bloko pavadinima"  
    fourthName <- getLine
    return (firstName, secondName, thirdName, fourthName)

然后从另一个文件

module Other where

import Input

doSomething :: IO ()
doSomething = do
    (n1, n2, n3, n4) <- getNames
    putStr "You entered:"
    putStr $ " " ++ n1
    putStr $ " " ++ n2
    putStr $ " " ++ n3
    putStr $ " " ++ n4
    putStrLn ""

答案 1 :(得分:1)

这一行:

module Input (firstName, secondName, thirdName, fourthName) where 

表示您的源文件将在顶部级别定义firstNamesecondName等。

您有firstName的定义,但它在函数main中定义,并且不能在其中看到。