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,运行我现有的逻辑,然后重新打包结果将其写出来。我会试试看会发生什么,然后发回。我想我应该先修复代码中另一个明显的性能缺陷。