小编Kev*_*vin的帖子

Haskell模式匹配 - 如何使用常量变量

我最好写这样的东西:

myValue1 = 1 :: Int
myValue2 = 2 :: Int

myFunc :: Int -> Bool
myFunc myValue1 = True
myFunc myValue2 = False

致电myFunc myValue2回报True- 不是我想要的.我知道为什么会发生这种情况,但有没有办法在Haskell中表达这一点而不诉诸C风格的#define语句?

haskell pattern-matching

18
推荐指数
4
解决办法
4028
查看次数

Haskell ByteStrings - 最终将大文件加载到内存中

问候,

我试图理解为什么我看到整个文件使用以下程序加载到内存中,但如果你注释掉"(***)"下面的行,那么程序将在恒定(约1.5M)空间中运行.

编辑:文件大约是660MB,第26列中的字段是一个类似'2009-10-01'的日期字符串,并且有一百万行.当它到达'getLine'时,该过程使用大约810MB

我是否正确地认为它与使用'split'拆分字符串有关,而且从文件中读取的底层ByteString不能被垃圾收集,因为它仍然被引用?但如果是这样,那么我认为BS.copy可以解决这个问题.任何想法如何强制计算 - 我似乎无法将'seq'放到正确的位置以产生效果.

(注意,源文件是制表符分隔的行)

提前致谢,

凯文

module Main where

import System.IO
import qualified Data.ByteString.Lazy.Char8 as BS
import Control.Monad


type Record = BS.ByteString

importRecords :: String -> IO [Record]
importRecords filename = do
    liftM (map importRecord.BS.lines) (BS.readFile filename)

importRecord :: BS.ByteString -> Record
importRecord txt = r
  where 
    r = getField 26
    getField f = BS.copy $ ((BS.split '\t' txt) !! f)

loopInput :: [Record] -> IO ()
loopInput jrs = do
    putStrLn $ "Done" ++ (show $ …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation bytestring

5
推荐指数
1
解决办法
807
查看次数