2012-07-15 45 views
4

我必须编写3个函数:一个将华氏转换为摄氏,一个将摄氏转换为开氏,另一个将华氏转换为开尔文,使用两个第一函数。在Haskell中创建一个交互式程序

我从来没有和Haskell一起玩过,所以这让我花了相当长的时间,但现在我发现它很简单。

无论如何,我需要为前两个函数创建交互式Haskell程序,并使用它们编写和使用管道可执行文件,以获得与第三个函数等效的内容。我一直在阅读管道,它似乎很简单。我的主要问题似乎是使功能交互。

任何帮助,提示和资源非常感谢!

+0

http://book.realworldhaskell.org/read/io.html – 2012-07-15 15:08:23

回答

4

在解决问题时,interact函数应该非常有用。由于UNIX惯例是过程应该使用文本(而不是数字,如温度)进行通信,这意味着函数将功能包装为String并返回String。这意味着你必须将你的华氏/摄氏温度功能包裹在新的函数中,这些函数可以接收和返回字符串而不是数字。

举个例子,让你开始,这个节目上,案件正在给它的所有字符串:

module Main (main) where 

import Data.Char (toUpper) 

main :: IO() 
main = interact upperCase 

upperCase :: String -> String 
upperCase = map toUpper 

你可以编译:

ghc uppercase.hs 

...然后你可以使用它(在Linux上)这样做:

echo "bla" | ./uppercase 
# Result: "BLA" 
+0

谢谢哟你这么多的迅速答案!对不起,如果我很密集,请耐心等待。 我所做的是为两个第一个函数(celsiusToKelvin.hs和fahrenheitToCelsius.hs)创建一个单独的.hs文件。我的理解是,使用管道,我应该可以做到: celsiusToKelvin.exe x | fahrenheitToCelsius.exe 应该给我同样的答案,因为我的第三个功能这是: 'fahToKel Z = celToKel(fahToCel Z)' 并在互动功能应用? – 2012-07-15 16:17:11

+0

如果你的程序应该使用管道,你不能'celsiusToKelvin x | fahrenheitToCelsius'。这需要'celsiusToKelvin'程序将其输入作为参数(其中'x'在该位置)而不是标准输入流读取。相反,你必须使用'echo x | celsiusToKelvin | fahrenheitToCelsius'。内置的'echo'程序将其参数写入其标准输出流,然后通过管道将其引导至'celsiusToKelvin'程序的标准输入流。这将产生正确的结果。 – dflemstr 2012-07-15 16:21:57

+0

谢谢,这正是我所需要的。它完美的作品。我回来了我的任务标记,我在这个问题上得到了满分。我的问题是,我的celsiusToKelvin和FahrenheitToCelsius程序每个都有字符串作为用户的提示,当将它们连接在一起时这当然不起作用。我把它们拿出来,它的工作! – 2012-07-25 23:13:02