[問題] Lazy Evaluation?

看板PLT (程式語言與理論)作者 (klanloss)時間13年前 (2011/11/12 13:30), 編輯推噓5(5012)
留言17則, 4人參與, 最新討論串1/2 (看更多)
剛剛在練習寫 Haskell 時,遇到個小問題,一時不解上來發問。 我想寫一個 function 用來讀 stdin 直到讀到特定的字元 成功版: getCharUntil :: Char -> IO [Char] getCharUntil c = do x <- getChar if x == c then return [] else do xs <- getCharUntil c return $ x : xs 失敗版: sequenceWhile :: Monad m => (a -> Bool) -> [m a] -> m [a] sequenceWhile f ms = sequence ms >>= return . takeWhile f getCharUntil' c = sequenceWhile (/=c) $ repeat getChar 失敗版會一直讀不停 Lazy evaluation 很耐死的,一定是有什麼誤會… 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 71.202.208.114

11/13 05:53, , 1F
因為 sequence 吧?
11/13 05:53, 1F

11/13 14:10, , 2F
失敗版的意思是:先讀無窮多個字元,再取其開頭部份。
11/13 14:10, 2F

11/13 14:34, , 3F
啊! 所以 >>= 是兇手!!
11/13 14:34, 3F

11/13 14:36, , 4F
想起來 sequence 是用 foldr 實做的了 難怪!
11/13 14:36, 4F

11/13 20:29, , 5F
>>= 應該不會強迫左邊算到底,所以應該是無辜的 xD
11/13 20:29, 5F

11/14 06:13, , 6F
那我還是不理解。。。
11/14 06:13, 6F

11/14 06:19, , 7F
我的意思是說只有 >>= 並不妨礙,可能你的理解是正確的 xD
11/14 06:19, 7F

11/14 15:10, , 8F
但在此例 sequence 被 >>= 規定要"算到底"吧?
11/14 15:10, 8F

11/14 21:13, , 9F
>>= 只需要判斷左邊沒有 fail 即可,但 sequence 要如何決
11/14 21:13, 9F

11/14 21:15, , 10F
定有沒有 fail? 只能全部看過一次!只要有個 fail 就會全
11/14 21:15, 10F

11/14 21:16, , 11F
部 fail. 然後 sequence 為了應付 >>= 也只需要檢查有沒有
11/14 21:16, 11F

11/14 21:17, , 12F
fail 就好,不需要「算到底」。除非用 deepseq 之類的東西
11/14 21:17, 12F

11/14 21:17, , 13F
惡搞否則很難算到底...
11/14 21:17, 13F

11/14 21:19, , 14F
上面的理解有個作弊的地方,就是我假設 sequenceWhile 要
11/14 21:19, 14F

11/14 21:19, , 15F
算到至少 Weak head normal form. 實際上得從 main 開始
11/14 21:19, 15F

11/14 21:19, , 16F
逆推才知道什麼是非算不可的...
11/14 21:19, 16F

11/14 23:24, , 17F
請不要推文超過三行...
11/14 23:24, 17F
文章代碼(AID): #1ElWH_ee (PLT)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 2 篇):
5
17
文章代碼(AID): #1ElWH_ee (PLT)