【发布时间】:2013-08-27 22:42:07
【问题描述】:
我对使用 Haskell 的 IO 有点陌生,虽然我通读了很多,但我的代码仍然无法工作。
我希望应用程序做什么:
- 读取文件的所有行(file1.txt、file2.txt、...),其中每行都包含数字(浮点数,如 1.12345)
- 对所有这些行进行排序(字符串排序或浮点排序无关紧要,我认为字符串排序更快?)
- 获取列表的中间元素并打印出来
这是我目前所拥有的代码。我可以保证在传递 [String] 时函数“中间”可以正常工作。
middle :: [a] -> a
middle xs = (drop ((l - 1) `div ` 2) xs) !! 0
where l = length xs
getSortedMiddleElement :: Int -> String
getSortedMiddleElement i = do
dat <- readFile $ "file" ++ (show i) ++ ".txt"
return $ middle $ sort $ lines dat
我从“Int -> Content”函数(我使用 Yesod)调用 getSortedMiddleElement,其中数字通过 URL 传递,中间元素应返回给用户。要从字符串中取出Content,必须是“String”,而不是“IO String”……这怎么能轻松实现?
提前致谢!
【问题讨论】:
-
一种可能性是将类型更改为
Int -> IO String,然后像处理函数一样处理函数,例如readFile或任何其他 IO 函数。 -
谢谢,到目前为止听起来不错!如何处理返回 HTTP 响应的
getTestR :: Int -> Handler RepPlain?getTestR :: Int -> IO Handler RepPlain不起作用:( -
我希望我能告诉你,但我绝不是 Yesod 方面的专家。 :(
-
也许
Handlermonad 已经包含IOmonad 了?你可以试试liftIO (getTestR 5)。 -
一个
lift就足够了,Handler RepPlain是变压器堆栈HandlerT s IO RepPlain的同义词(其中s是基础类型的类型,通常命名为App。这是为了但是,Yesod 1.2,但是由于我不知道您的版本,所以这是我能给出的最佳答案。
标签: sorting haskell io readfile yesod