haskell-jp / questions #18

@ has joined the channel
https://conscientiousprogrammer.com/blog/2014/08/07/understanding-cloure-transducers-through-types/
上記の記事の中で以下のような記載があったので iteratee について調べていたのですが、
関連する資料は 2010 年ごろの物が多く最新の情報などはあまり反映されていないようでした。(気がするだけかも?)
well-known types such as foldables, iteratees, lenses, etc.

https://www.yesodweb.com/blog/2010/09/enumerators-tutorial-part-1
この記事は enumerator パッケージにおける実装などについて詳しく書いているのですが肝心の enumerator が deprecated になっていました。

このあたりについてどの辺が参考になるかなど教えていただけると嬉しいです。
ちなみに、オリジナルのものはまだ目を通せていないです。
http://okmij.org/ftp/Haskell/Iteratee/index.html)
新しめのライブラリはこちらのベンチが参考になります http://fumieval.hatenablog.com/entry/2017/10/17/172322 出来る事が多いpipes、pipesに匹敵する高機能とpipesを遥かに上回る安全性を兼ね備える代わりに若干遅いconduit、それらより機能を制限する代わりに高速なライブラリとして幾つか選択肢が存在する感じです。まだ見てないんですがstreamlyというのも新しくて色々すごいらしいです。
各種ライブラリーのベンチマークについては https://haskell-jp.slack.com/archives/C4M4TT8JJ/p1521628071000253 もどうぞ。
@h-michael has joined the channel
machinecell の質問です。
ストリームを最後まで accum して、その結果を使ってストリームを最初から流し直す、みたいなプロセスってどう書けばよいのでしょうか?
雰囲気的には、こんな感じのことがやりたいです。

-- |
-- >>> P.run pa [1 .. 3]
-- [(1,6),(2,6),(3,6)]
pa :: Monad m => P.ProcessT m (P.Event Int) (P.Event (Int, Int))
pa = proc x -> do
  sum' <- P.accum 0 -< (+) <$> x
  end <- P.onEnd -< x
  sum'' <- returnA -< sum' <$ end
  returnA -< (,) <$> x <*> sum''     -- Event a は Applicative でないのでここでエラー
Hoppy - C++ FFI Generator for Haskell
http://khumba.net/projects/hoppy/
を使ってみています。
(&&&) で分岐して片方で accum すれば、必要なストリームは作れる。
あとはどうやって合流するか・・・
出先なので動作確認できてないんですが、こんなコードでどうでしょうか。

pa = P.switch collect combine
  where
    collect = proc x -> do
      lRev <- P.accum [] -< (:) <$> x
      sum' <- P.accum 0 -< (+) <$> x
      ed <- P.onEnd -< x
      P.muted &&& returnA -< (reverse lRev, sum') <$ ed
  
    combine (l, sum') = proc _ -> do
      x <- P.blockingSource l -< P.ZeroEvent
      returnA -< (, sum') <$> x
同じストリームを2度流すという事は必然的に、メモリ上に全要素を保持する事になるので、処理的にあんまりストリームライブラリ向けじゃないんですよね……上のコードでは一個目のaccumで明示的にリストをメモリに保持しています
おお、できました!
ありがとうございます!
しかし、確かにそうですね。要素を全部リストにしてしまうなら、別にストリーム上で和を算出しなくてもよいような・・・
和を作るプロセスとタプル化するプロセスを別々に定義して、同じストリームを順に流す方が自然なのかも。
Stackを用いてGHCをインストールしていなくても各OSで実行可能なプログラムを生成する方法ってありますかね。。
Haskell Platformを使うとか、GHCを直接インストールするとか、そういう話でしょうか?
Haskellで書いたプログラムがあって、それをHaskellを実行できる環境が全くないパソコンでもダブルクリックとかで実行可能なものを生成したいんです。
C言語のライブラリーとかに依存していない限り、普通はビルドされた実行ファイルはそのまま、ビルドしたOSと同じOSであればダブルクリックで実行できます。
stackの場合、 stack --local-build-path=<好きなパス> install と実行すれば、 <好きなパス> にビルドした実行ファイルが作成されます。
ありがとう!できました!ちなみにビルドしたOSとは別のOSの実行ファイルを生成するのって可能ですか。
そういうのはクロスコンパイル機能というのですが、
残念ながらクロスコンパイル機能は鋭意開発中という感じです(一応使えるけどかなり実験的だし手間もかかる)。
Linuxの異なるディストリビューション同士ぐらいであればDockerを使うなりstatic binaryにするなりすればできますが。
なるほどー。。ありがとうございます。
どなたか、私の最初の回答でも直らなかったと言うことなので、もしほかに原因に思い当たる節があれば教えてください。 :bow:
https://teratail.com/questions/121456
(もちろん、質問者が何か入力を間違えてしまった可能性も捨てきれませんが...)
@a_kawashiro has joined the channel
:heavy_check_mark: 解決してた。やっぱりtypoだったようですね :relieved:
@ has joined the channel
blaze-htmlを用いて以下のようなものを生成したいのですが、どうすればよいでしょうか
<p>Hello <span>World</span></p>
blaze-htmlはあまり使ったことないですが、以下の感じでいけそうですね!
$ stack --resolver nightly-2018-03-18 ghci --package blaze-html

> import Text.Blaze.Html5
> import Text.Blaze.Html.Renderer.String
> import Data.Semigroup
> :set -XOverloadedStrings
> let inner = "foo" <> Text.Blaze.Html5.span "bar" <> "baz"
> let html = p inner
>  renderHtml html
"<p>foo<span>bar</span>baz</p>"
なんと!やってみます!ありがとうー!
@nasa has joined the channel
stackのtestフォルダー内にあるファイル(例えば`Spec.hs`)で定義した関数をghciを用いてターミナルで実行できるようなコマンドがあったと思うのですが、なんでしたっけ。。
例えば Spec.hs内に`foo :: [Int] -> Bool`という関数があった場合にはghci内で
quickCheck foo
と呼び出したいのです。
stack ghci --test ではダメ?
ありがとうございます。
stack ghci test/Spec.hsでいけました!
stack ghci test/Specでは実行できなかったので他に方法があるのかと勘違いしていました。
haddock の質問です。
モジュールや関数のドキュメントの出力する/しないを、環境変数か何かで切り替えたりするようなことはできますでしょうか?
内部向け(development)と外部向け(production)で、出力内容を切り替えたいです。
ちゃんと試してなくて恐縮ですが、
http://haskell-haddock.readthedocs.io/en/latest/markup.html#module-attributes に書いてある
{-# OPTIONS_HADDOCK hide, prune, ignore-exports #-}

とかが捜し物ですかね? :thinking_face:
返信気が付きませんでした
基本はimport側で共通のprefixを付けているのですがTextだけはコピペが増えてきたので楽に共通化出来るならやりたかったなと思いました
そのオプションを何らかの条件でオンオフする方法、というのが探しものです。
{-# OPTIONS_HADDOCK hide #-}
すると、そのモジュールが出力されなくなるのは確認しています。
やりたいのは気分的には

IF PROD
{-# OPTIONS_HADDOCK hide #-}
END


みたいなことです。
機械学習のライブラリで良さげなものを教えてください。
重要な一言が抜けてました。あとはcabal のflagとCPPを組み合わせて使えばどうにでもなりそうな気がします。
具体的には https://guide.aelve.com/haskell/cpp-vww0qd72#item-oh9ytz0p でやっているようなことです。
cabalで特定のフラグをONにしたときだけcpp-optionsに-Dオプションを渡して定数を定義して、
Haskellのソースコード側で
ifdefを使うのです
例えば、FooをFで参照したいのならば、Fという名前のモジュールを作ってその中身でFooを再エクスポートをすれば、F.xxxという形で定義を参照できるようになる、という形でできませんか?
期待する内容と違うかもしれませんが、こういう情報があります。
https://github.com/Gabriel439/post-rfc/blob/master/sotu.md#machine-learning

tensorflowへのバインディングは、最新のtensorflow 1.7にも対応しているようです。
HLearnは最近は開発が止まってるようです、、、
Hlearnそうなんですか…
もったいないですね、、、
同じような質問がStack Overflowにあるみたいで、回答はあきらめるかCPPを使うかといった感じです https://stackoverflow.com/questions/49940351/what-is-an-alternative-to-a-prelude-with-qualfied-imports
凄く初歩的な質問で恐縮なのですが、
Text←→Intの変換は、どのような方法が定番なのでしょうか?

今は、プログラム毎に(pack . show)や(read . unpack)で変換しているのですが、
毎回記述するので、何かライブラリ側で提供されていないのかなぁと思う一方、
text-showとData.Text.Readで行うのも対称的じゃないので、どうなんでしょう?と思っている次第です。
よろしくお願い致します。
確かに text-show 以外聞いたことがないですね。。。 :disappointed:
そもそもRead自体手を抜きたいとき以外使うな(遅いし、ちゃんとしたのはパーサーを書けばいい)という風潮なので、あまり需要がないのかもしれません