在Haskell中创建一个交互式程序

4
我需要编写3个函数:一个将华氏度转换为摄氏度的函数,一个将摄氏度转换为开尔文的函数,和一个使用前两个函数将华氏度转换为开尔文的函数。
我以前从未接触过Haskell,所以这花费了我相对较长的时间,尽管现在我看到它非常简单。
无论如何,我需要为前两个函数创建交互式Haskell程序,并使用它们来组合管道以获得第三个函数的等效结果。我一直在研究管道,它似乎很简单。我的主要问题似乎是使函数变得交互式。
任何帮助、技巧和资源都将非常感激!

http://book.realworldhaskell.org/read/io.html - Karoly Horvath
1个回答

4
interact函数在解决问题时应该非常有用。因为UNIX约定是进程之间应该使用文本进行通信(而不是数字,比如温度),这意味着interact函数包装了那些接受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"

非常感谢您的及时回答!如果我有点迟钝,请您耐心等待。我的做法是为前两个函数(celsiusToKelvin.hs和fahrenheitToCelsius.hs)创建了一个单独的.hs文件。我的理解是,使用管道,我应该能够执行以下操作:celsiusToKelvin.exe x | fahrenheitToCelsius.exe这应该会给我与第三个函数相同的答案,即:fahToKel z = celToKel (fahToCel z)interact函数适用吗? - Mark Smith
如果你的程序需要使用管道,那么你不能这样做:celsiusToKelvin x | fahrenheitToCelsius。这会要求 celsiusToKelvin 程序将其输入作为参数读取(在该位置上是 x),而不是从标准输入流中读取。相反,你必须使用 echo x | celsiusToKelvin | fahrenheitToCelsius。内置的 echo 程序将其参数写入其标准输出流,然后通过管道传递到 celsiusToKelvin 程序的标准输入流。这将产生正确的结果。 - dflemstr
谢谢,这正是我所需要的。它完美地运行了。我拿回了我的作业并在这个问题上得到了满分。我的问题是我的celsiusToKelvin和FahrenheitToCelsius程序中每个都有字符串作为用户提示,当然在将它们一起管道化时不起作用。我把它们拿出来了,现在它可以工作了! - Mark Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接