#Haskellの処理系を作るとして、式が簡約済みであれば簡約された値を使うって操作がどっかに入ると思うんですが、プリエンプティブマルチスレッドな処理系ではそこどうやってるんでしょ (1)律儀にロック(遅そう) (2)平行して簡約しても結果は同じはずだからロックなど気にせず必要そうなら簡約しちゃう (少ない確率で重複する計算をする可能性あり) (3)その他
#よく分かっていませんが、"Concurrent Haskell"という論文の2.3あたりですかね?
#"Runtime Supoort for Multicore Haskell" の 8 あたりかも。
#やや、"Runtime support..." は私の知りたかったことそのもののような感じです。ありがとうございます。
#結局、"Haskell on a Shared-Memory Multiprocessor" を読めってことみたいですね。
#やはり副作用無いと便利ですね。投機的に実行、途中でチェック、仕事がかぶってたら相手を待つ、みたいなことができる。
#kazuさん
#kazuさん 質問1は words . unwords でどうでしょう
#すみません unwords . words でした
#単語間の連続したスペースは保存したいです。
#String だと reverseを使うのより効率のよいのは考えにくいですねぇ。
#import Data.Char
chop :: String -> String
chop = chop' ""
chop' :: String -> String -> String
chop' a "" = ""
chop' a (c:cs) | isSpace c = chop' (c:a) cs
| otherwise = foldl (flip (:)) (c:chop' "" cs) a
#そうとう無理筋↑
#効率悪いし
#文字列末尾の空白文字をとりのぞく関数chop :: String -> String の、chop = reverse . dropWhile isSpace . reverse より効率の良い実装ってあるんだろうか?
#ないとすればそれを証明するのはどうすればいいのだろう?
#正規表現でもバックトラックするので、reverse でよしとします。
#ふと思ったんですが、Zipper とか役に立たないんですかね?
##いいですねぇ。なるほど。
#chop :: String -> String
chop = foldr f ""
where f c "" | isSpace c = ""
| otherwise = [c]
f c xs = c:xs
#いいですね
#しばらく考えないと、どうしてこれでいいのかわからなかったのですが、ようやくわかりました。行頭の空白を取るならこうでしょうか:
#cut :: String -> String
cut = fromMaybe "" . foldl go Nothing
where
go Nothing c
| isSpace c = Nothing
| otherwise = Just [c]
go (Just xs) c = Just (xs ++ [c])
#fromMaybe 取れるのか、考える
#nobsun と同じ方針で fromMaybe 除去できました、なるほど
#まあ、前を落すのは dropWhile isSpace のほういいですよね。効率からいって。
#がーん、確かに…