haskell-jp / questions #32

うまくいったようです。ありがとうございます! :clap:
@kameoka.ryota has joined the channel
@irxnjhtchlnrw has joined the channel
@kobori.tomoyuki has joined the channel
@irissetosa976 has joined the channel
@wakaka2277 has joined the channel
@t-era has joined the channel
lyrical.magical.techn
@lyrical.magical.techn has joined the channel
Textなどをコンソールに出力する際に通常だと"\n"や"\t"があるとnewlineやtabに変換されますが、
それををそのままプリントする方法ってありますか?
例えば "Hello \n World"を出力する際に "\n"をそのままにして、"Hello \n World"として出力するみたいな。
show でそうなりませんかね
show じゃダメってことですよね。細かいニーズを考えたら作るしかないと思います。。。
そうなのかー
いや、私が深読みしすぎているだけかもしれないですが。。。 :sweat_drops:
jsonにするとか?
なるほど、一度JSONにしてから出力すればいいのか!
putStrLn $ show ("\n" :: Text)
"\n"
JSONへの変換でよくてshowじゃダメな理由って何ですか?
show がダメというのは @igrep さんの誤読なのでは……?
とくにないです。。
showでくるんだらできました。。自分は疲れてるかもしれない。
ありがとうー
蛇足だとは思いますが、 "\n""\\n" はまったく別の文字列ですので、要件は整理したほうがいいと思いますよ。処理したいのが "\\n" という文字列でそれを表示したいのであれば、文字列の生成時に \ を適切にエスケープすべきです。逆に、改行文字を含む文字をエスケープして画面に出したいのであれば、改行文字をエスケープする関数( show はその一種だが、 " で括ったりするのでエスケープ方法としては独特)を作ってそれを噛ませて表示すべきです。
@goto.ryota has joined the channel
@overkill.red99999 has joined the channel
@kagilinn has joined the channel
「Haskellによる並列・並行プログラミング」_Parallel and Concurrent Programming in Haskell_ () の p.69 `Rate-limiting the Producer` にある流量制限をする `exercise` の解を教えて下さい 非力のため実行時エラーが取れません
`stack overflow` () にヒントがありますが 完全解は省略されています
よろしくお願いします
ちょっとまだ状況把握できてないので解けるかどうかも自信がないのですが、いずれにしても、
@karoyakani さんが自分でどこまで書いてみてどううまくいかなかったのか、教えていただけないでしょうか?
そうでなければアドバイスしにくいです。
`parconc-examples` から `rsa-pipleline.hs` と `Stream.hs` を取り出して `streamFromList` や他を次のように変えると エラーになります ``` $ cabal unpack parconc-examples
$ cd parconc-examples-0.4.7
$ cabal install --only-dependencies

$ diff rsa-pipeline2.hs rsa-pipeline.hs
14c14
< import Stream2
---
> import Stream
42c42
< s0 <- streamFromList f c (chunk (size n) b)
---
> s0 <- streamFromList (chunk (size n) b)
47,49d46
< where
< f = 100
< c = 200


$ diff Stream2.hs Stream.hs
10c10
< module Stream2
---
> module Stream
25d24
< | Fork (Par ()) (IList a)
34d32
< rnf (Fork _ a) = rnf a
40,41c38,39
< streamFromList :: NFData a => Int -> Int -> [a] -> Par (Stream a)
< streamFromList f c xs = do
---
> streamFromList :: NFData a => [a] -> Par (Stream a)
> streamFromList xs = do
43c41
< fork $ loop f c xs var -- <2>
---
> fork $ loop xs var -- <2>
46,51c44,45
< loop _ _ [] var = put var Nil -- <4>
< loop 0 c (x:xs) var = do
< tail <- new
< let op = loop 0 c xs tail
< put var (Fork op (Cons x tail))
< loop f c (x:xs) var = do -- <5>
---
> loop [] var = put var Nil -- <4>
> loop (x:xs) var = do -- <5>
54c48
< loop (f-1) c xs tail -- <8>
---
> loop xs tail -- <8>
67,68c61,62
< Nil -> put outstrm Nil
< Cons h t -> do
---
> Nil -> put outstrm Nil
> Cons h t -> do
72d65
< Fork p (Cons h t) -> fork p >> streamMap fn t >> return ()
83,85c76,77
< Nil -> return acc
< Cons h t -> streamFold fn (fn acc h) t
< Fork p (Cons h t) -> fork p >> streamFold fn (fn acc h) t
---
> Nil -> return acc
> Cons h t -> streamFold fn (fn acc h) t


$ ghc -O2 -threaded -rtsopts rsa-pipeline2.hs

$ ./rsa-pipeline2 /usr/share/dict/words >/dev/null +RTS -N2
rsa-pipeline2: no result
CallStack (from HasCallStack):
error, called at ./Control/Monad/Par/Scheds/TraceInternal.hs:250:11 in monad-par-0.3.4.8-6smWrlrr5w82FJ0Oii5wmF:Control.Monad.Par.Scheds.TraceInternal
```
長くなってすみません
diffを当てるのも面倒なので、gistあたりに書いたものをアップロードしちゃってください。
別にこのSlackに完結する必要はないです。
@ide_0109 has joined the channel
遅れましたがこちらになります ``
どれかのライブラリーに用意されてますかね? https://twitter.com/kakkun61/status/1073752004244033536
これって、昔どっかで見たけど、[Word8] をWord32に変換する関数はありますかってやつと同じですよね? ByteStringはLazyな方という仮定ですけど その質問の回答のコピーですと 無いです 探せばあるかもですが、、、
[Word8] 経由しない方がパフォーマンス的にはいいっちゃいいですけど
とりあえず経由してもいいです
ヒントをいうと, streamMap の実装がおかしいと思います
@negi23 has joined the channel
@t160d011 has joined the channel
@kohsho2015 has joined the channel
@e1q18048 has joined the channel
型レベルリストに対する結合演算 http://hackage.haskell.org/package/extensible-0.4.10.1/docs/Data-Extensible-Struct.html#t:-43--43- を使った際、結合則がGHCに認識されないのか、
Couldn't match type ‘(xs ++ ys) ++ zs’ with ‘xs ++ (ys ++ zs)’
というエラーになってしまうことがあります。
これを、(型注釈をつけられた) 式を変えない かつ 型注釈の xs ++ ys ++ zs という箇所に、( xs ++ (ys ++ zs) のように)明示的に括弧を加えないで型チェックを通すことはできるでしょうか?
https://gist.github.com/igrep/b3391a2287a0fcf093472cb6c57048db に、テストケースとして使えるファイルを上げておきました。
式を変えない
って,
xs `happend` (ys `happend` zs)
にもしないという意味ですか?
そうです。
逆にどんなことならしてもいいんですか?GHCプラグインを挿すとかですか?
型宣言 happend3 :: Record xs -> Record ys -> Record zs -> Record (xs ++ ys ++ zs)
xs ++ ys ++ zs 以外の箇所は変えてもいいです。
GHCのプラグインはありだと思います。そういえばまさにそれをやるためのがあったような。。。 :thinking_face:
それは一般に非自明なので前者を後者に変換する関数(証明)を定義してそれを全体にかぶせるとかになると思います
(LiquidHaskellならこれくらいは解けたりしないのかな…量化子入ってると流石に厳しいか
結合律さえいえれば(x = y) -> F x = F yとかを使ってゴニョゴニョやるとコンパイルも通ると思います(どうみてもただの定理証明ですが)
たぶん普通は singletonsSing な結合則の証明オブジェクトを作ってそれで検査器に「わからせる」
ああ、そうですね。
前者を後者に変換する関数(証明)を定義
の具体的なやり方を知りたいです。
上に同じくsingletons使うのが普通だと思います