Haskell中更好的数据流读取

Haskell中更好的数据流读取,haskell,stream,Haskell,Stream,我试图解析一个输入流,其中第一行告诉我有多少行数据。我最终得到了以下代码,它是有效的,但我认为有更好的方法。有吗 main = do numCases <- getLine proc $ read numCases proc :: Integer -> IO () proc numCases | numCases == 0 = return () | otherwise = do str <- getLine

我试图解析一个输入流,其中第一行告诉我有多少行数据。我最终得到了以下代码,它是有效的,但我认为有更好的方法。有吗

main = do
    numCases <- getLine
    proc $ read numCases

proc :: Integer -> IO ()
proc numCases
     | numCases == 0 = return ()
     | otherwise = do
         str <- getLine
         putStrLn $ findNextPalin str
         proc (numCases - 1)
main=do
numCases IO()
原核酶
|numCases==0=返回()
|否则=做

str使用
复制
序列

main, proc :: IO ()

main = do numCases <- getLine
          sequence_ $ replicate (read numCases) proc

proc = do str <- getLine
          putStrLn $ findNextPalin str
main,proc::IO()

main=do numCasesDave Hinton的答案是正确的,但另一种编写相同代码的方法是:

import Control.Applicative

main = (sequence_ . proc) =<< (read <$> getLine)

proc x = replicate x (putStrLn =<< (findNextPalin <$> getLine))
导入控件。应用程序
main=(sequence.proc)=您(以及前面的答案)应该更加努力地将IO与逻辑分开。让main收集输入并单独(如果可能的话)完成工作

import Control.Monad -- not needed, but cleans some things up
main = do
    numCases <- liftM read getLine
    lines <- replicateM numCases getLine
    let results = map findNextPalin lines
    mapM_ putStrLn results
import Control.Monad——不需要,但会清理一些东西
main=do

numCases在Haskell中解决SPOJ问题时,尽量不要使用标准字符串。ByTestRing的速度要快得多,我发现您通常可以忽略测试的数量,只需在第一行之外的所有内容上运行一个映射,如下所示:

{-# OPTIONS_GHC -O2 -optc-O2 #-}

import qualified Data.ByteString.Lazy.Char8 as BS

main :: IO ()
main = do
    (l:ls) <- BS.lines `fmap` BS.getContents
    mapM_ findNextPalin ls
{-#选项(GHC-O2-optc-O2#-}
将限定数据.ByteString.Lazy.Char8作为BS导入
main::IO()
main=do

(l:ls)+1;我对你们中的一些人速度如此之快感到恼火,但我很高兴我实际上知道了这个案例的答案(用抽象的术语)。是的,当我看到这个时,我写了差不多一半的答案。。。我想,我在回答之前用GHCi运行代码的习惯会让我慢下来。请注意,一旦你理解了常见的函数,你(op)就可以稍微清理一下。以replicateM(或我的答案)为例,对于这样的问题,您也可以只编写
main=interact$unlines。map(show.findNextPalin.read)。尾巴。行
关于
replicitem
的优点,这比
序列
好。不过,我不太清楚你所说的逻辑划分是什么意思。所有的实际工作显然都是在
findNextPalin
中进行的,而您分离出来的唯一额外纯函数是一个
map
,代价是(在我看来)使函数更加冗长。在这个过程中,您还更改了代码的行为。我在这个问题上用字符串处理了ok。我直接在字符串上计算/排序。但我会学习BYTESTRING来提高我的技能。谢谢你的提示。“我喜欢你的技术”(l:ls)我添加了{-#选项#GHC-O2-optc-O2#-}到我最后一次提交,从5.31秒到5.51秒。这是随机噪音还是优化没有多大区别?@Tim Perry-这很可能什么都没做,但我真的不知道GHC的内部结构,所以不能肯定。这只是我从我链接的Haskell SPOJ文章中找到的一个片段。顺便说一句,我是aw您在SPOJ上提交给佩林的内容--35M内存和5.31秒对我来说似乎太多了。因为这是一个很大的I/O问题,您肯定想查看Haskell wiki,或许可以尝试邮件列表。(我自己没有尝试过这个问题,但我会尝试一下,然后回到这里,让您知道我是如何做到的。)@Tim Perry-但由于这是一个很大的IO问题,您会发现bytestring大大加快了速度。引用RWH的话:“使用bytestring编写的代码通常可以达到或超过C的性能和内存占用,同时保持Haskell的表现力和简洁性。“@rtperson-我想我可以读入它,解包ByteString,运行我现有的逻辑,然后重新打包结果将其写出来。我会试试看会发生什么,然后发回。我想我应该先修复代码中另一个明显的性能缺陷。