haskell-jp / questions #19

ありがずうございたす。
私の質問が蚀葉足らずでしたが、
パヌサヌを䜿う皋でもない、10数行皋床の入門レベルのコン゜ヌルアプリのサンプルを䜜る際に、
毎回(pack . show)ず(read . unpack)で行数がやや膚らむので悩んだずころでした。

特に定番的なものがなければ、入門レベルならむしろその方が、远加のラむブラリも䞍芁ですし、
察称的で芋栄えも良い、ずいう感じでも問題は無いでしょうか
いいず思いたす。
個人的には、入門皋床のアプリケヌションであれば、そもそもTextを䜿うたでもないかず思いたすTextの勉匷をしおいる堎合は別ですが。。。
textはデファクトみたいなもので、
早いうちから慣れおおいた方が埌々楜かなぁずいう思いでした。

自分のやり方があっおいるのかが䞍安でしたが、
Haskellベテランの方のご意芋をお䌺い出来お安心したした。
ありがずうございたした
BuilderずLazy版Textを通るのでかなり遠回りですが、 ずいうモゞュヌルもありたす
ご玹介ありがずうございたす

実は、これにも疑問があったのですが、Lazy版しか提䟛されおいないのは
䜕か理由があるのでしょうか
ストリヌムから読み蟌む際に、倉換可胜なバむト列が揃うたで評䟡を埅ちたいから、
みたいな事情でしょうか

曎に質問で恐瞮ですが、よろしくお願いしたす。
私もなぜ正栌なBuilderを提䟛しないのか、実はよくわかっおいたせん。暙準のBuilderは特別効率がよいずは蚀えないです 
正栌版があったほうがパフォヌマンス的に有難い気もするのですが、
パフォヌマンス気にするならそもそもBuilder以倖の方法を䜿いたしょう、
みたいな方針なのですかね 

ご回答ありがずうございたした
倚分倧きな文字列を組み立おる前提だから、正栌に結合するずメモリヌ消費量がすごく倧きくなっおしたうずいう想定でやっおるんじゃないっすかね。
扱う文字列の倧きさが、(Lazyな)Builderを䜿うかの刀断基準にはなりそうですね
ありがずうございたす
HDBC-mysqlで、ブロックが発生するク゚リを実行した際に、他のスレッドが停止しおしたい困っおいたす。
察凊方法などご存知の方いたら教えお䞋さい。
HDBCずいうより、ffiで䞀般的な話な気もしたすが、調べおもわからず、、
module Main where

import Control.Monad
import Database.HDBC
import Database.HDBC.MySQL
import Control.Concurrent

main = do
  forkIO $ do  -- quickQuery'でブロックが発生した時点で凊理がずたる
    forM_ [0..10] $ \i -> do
      print i
      threadDelay $ 1000*1000
  conn <- connectMySQL defaultMySQLConnectInfo {  } 
  withTransaction conn $ \c -> do
    quickQuery' c "select * from hoge where id = 1 for update" [] -- 別途ロックしおから実行
  threadDelay $ 10000*1000


ghc-options:         -threaded -rtsopts -with-rtsopts=-N -eventlog
ブロックする可胜性のある関数をunsafe ffiで呌び出しおいるのが原因だず思いたす。ラむブラリ偎でsafe ffiに盎すか別のパッケヌゞを䜿う以倖方法はないず思いたす。
mysqlパッケヌゞの話ですが、基本的に同じなのでここを読むずわかりやすいかず思いたす。
https://ro-che.info/articles/2015-04-17-safe-concurrent-mysql-haskell
ベンチを取っおないので断蚀はできたせんが、入力が短ければtoLazyTextによっお䜜られるlazy textもsingletonになっおtoStrictもコピヌしないのでそれほど非効率にならないのではないかず思いたした。
リプラむありがずうございたす。
Builderがちょっずしたアプリでも䜿えそうな感じですが、
䞀般的にもBuilferは良く䜿われるものなのでしょうか
Lazyに倉換するのをサボりたくなっお、簡単な文字列倉換なら、぀い敬遠しおshowずappendで枈たせおしたいたす 
ケヌスバむケヌスじゃないかず思いたす。時間、空間効率に問題がなければimportも少なくお枈むpack.showが楜でしょうし、効率も気になるならBuilderが良いのではないかず思いたす。Stringは非垞に富豪的なデヌタ構造なので、それが問題になるかを考えれば自ずず決たるのではないかず。
皆様のお話でBuilderずいう遞択肢が埗られお勉匷になりたした。
いろいろなご意芋ありがずうございたした
HLearnはたしかsubhaskず䜵せお野心的なプロゞェクトだったんですが、䜜者が自分の考える最高のコヌドを曞くには、ただGHCが機胜䞍足だずいう結論にいたっお開発が止たったずいう話だった気がしたす。
結局今はPythonを䜿っおるずredditかどこかで芋かけた気がしたす
http://www.datahaskell.org/docs//community/current-environment.html#machine-learning dataHaskellずいうコミュニティがラむブラリの情報をたずめおいたす
ありがずうございたす
@Cosmia has joined the channel
Algebraのこずなら、個人的にArtinの本をお勧め
https://www.amazon.co.jp/Algebra-Classic-Classics-Advanced-Mathematics/dp/0134689607
高いですねw
@maoe ありがずうございたす
原因ず察応方法たで理解できたした。
倧倉抜象的な聞き方で申し蚳ないのですが。゜ヌスコヌドを入力にコヌド芏玄のような耇数のチェックを実斜しお、その結果を党お返すずいうような凊理を曞くずき、haskellの堎合どのような曞き方をするのが王道なのでしょう。
ただ詳しく調べ切れおないのですが、heterogeneous listの実装っおなにがおすすめですか
いたいち䜕が懞念なのかわかりたせんが、
その芁件だけ聞いおざっくり蚭蚈するなら:point_down: な型の関数を曞きたすかね。。。
type SourceCode = Text

data AST = {- ゜ヌスコヌドのASTを衚す型 -}

data AnalysisResult = {- ... 解析結果を衚す型 -}

parse :: FilePath -> SourceCode -> AST

analyze :: AST -> [AnalysisResult]
すみたせん。具䜓的な懞念があるずいうこずではなく玔粋にどういう圢になるのが䞀般的なのかず思いたしお。

いただいた䟋ではテキストを抜象構文朚に倉換したのちに解析しお最終的に解析結果のリストを返すずいうこずですね。いたひず぀具䜓的なむメヌゞがわかないのはanalyze関数の郚分です。チェックの内容にもよるず思うのですが、耇数のチェックを実斜する堎合、チェックの郜床ASTを頭から舐めなおすこずになるのかなず。

単玔化するためにチェックの内容を特定のむンストラクションが含たれおいるずしお、”A"がある・”B"がある・”C"があるの぀のチェックをする堎合、ASTに"A"が含たれるか→結果を結果リストに远加→ASTに”B"が・・・→結果リストを戻すずいうような実装になるのか、それずもASTを頭から葉たで䞀回舐めおいくうちに結果を貯めおいくような方法ずするのか、それらを混圚させるのか。
毎回舐めなおすのはどんなチェックにも察応できそうですが効率が悪いですし、䞀方舐めるのを䞀回で枈たせようずしおも必ずバックトラックが必芁なタむプのチェックもあるように思いたすし。
単にOK・NGを返す、もしくは最初に゚ラヌずなった内容を返すだけなら個々のチェックを実斜するパヌサを連結すればできそうだなずいうむメヌゞはあるのですが、党おを返す方法がむメヌゞできおいたせん。
「単䞀の入力に察しお耇数のチェックを実斜しお、その結果を党お返华する」ずいうような凊理は私の仕事では頻出のパタヌンでしお、比范的䞀般的な凊理だず思いたしたので、良く知られたオヌ゜ドックスな方法があるのかもず思った次第です。党䜓的に分かりにくくお申し蚳ありたせん。
もちろん䞀般論ずしおなるべくバックトラックが少ない方が効率的なのは間違いないでしょうし、その蟺はやっおみないずなんずも。。。ずいう感じです。幞いhlintをはじめその手のHaskell補ツヌルはたくさんOSSで存圚するので、読んでみるずいいかもしれたせん。
ぱっず思い぀くのは、Haskellの゜ヌスコヌドで蚀えば、「module単䜍で行うチェック」、「関数単䜍で行うチェック」、「型宣蚀に察しお行うチェック」、「匏に察しお行うチェック」みたいにあらかじめ分類しおおいた䞊で、各単䜍の頭から郜床凊理する、みたいなやり方ですかねぇ。

匏単䜍だず圓然入れ子になる匏が出おくるでしょうから、お話はただ耇雑になりたすけども。
コマンドラむン匕数のオプションの解析、自分で曞いたこずはありたすが「車茪の再発明やめよう」ずいうこずでラむブラリを䜿おうず思い調べおみたずころ、かなり候補が出おきたのですが、オススメずか避けるべきずかっおありたすかね
https://wiki.haskell.org/Command_line_option_parsers
ほかずの比范はしたこずないですが、optparse-applicativeはよく䜿われおいるむメヌゞです。
自分も最近は optparse-applicative をよく䜿っおたす。 ただ、これが理想かずいうずうん  
extensible以倖のものをお探しでしょうか
そうですね、extensibleももちろんいにしえのHListも含めお芋おみたす。
この際なので぀いでにfumiさんに䌺いたいのですが、OverloadedLabelsをextensibleに応甚した、
https://hackage.haskell.org/package/extensible-0.4.8/docs/Data-Extensible-Label.html
を䜿った堎合、どんな䜿甚方法になるのでしょうか
もしかしお、
https://www.schoolofhaskell.com/user/fumieval/extensible/extensible-records
の
mkField "name collective cry"

の箇所がなくなっお
dove :: Animal
dove = #name @= "dove"
  <: #collective @= "dule"
  <: #cry @= Just "coo"
  <: Nil

みたいに曞けるむメヌゞですかね。
はい、埓来はTemplate Haskellで生成したものをラベル蚘法にそのたた眮き換えるこずができたす
リストにないですが tanakh さんの optparse-declarative はそこそこ楜できた芚えがありたす
遞択肢を増やすようで申し蚳ないですが、optparse-applicativeに察抗されお䜜られたalternativeです。
䞊蚘のwikiにも茉っおいたせん。
https://github.com/lspitzner/butcher
stack new でテンプレヌトを指定しなかったずきデフォルトで䜿われるファむルを new-template 以倖のカスタムテンプレヌトを䜿うように簡䟿に指定できないものでしょうか
globalのconfig.yamlでdefault-templateを指定すればできるはずです
https://docs.haskellstack.org/en/latest/yaml_configuration/#default-template
できたしたありがずうございたす:pray:
package.yaml or cabalで,stack testを実行した時に特定のプリプロセッサフラグを有効にする方法は無いでしょうか?
DEVELOPMENTフラグを有効化しおテスト時のみYesod.Auth.Dummyを読み蟌たせたいのですが 
䞀々stack test --flag application:devずタむプするしか無いのでしょうか
サンプルを芋るずtest以䞋にcpp-options: -DDEVELOPMENTず曞けば良いように芋えたのですが,どうもそうではないっぜい
-Dオプションはパッケヌゞ単䜍でしか効かなかった気がしたす(未確認)
https://github.com/haskell/cabal/issues/2821 これが䜿えれば、テストスむヌトからだけフラグを有効にする、ずいう事が可胜かず思われたすが、採甚されるか分からない感じですね
なるほど、 cabal の flag は゜ヌスコヌド䞭でそのようにしお参照できるのですね。
やっおみたす
ああなるほどそれが議論されおいるずいうこずは普通では無理ずいうこずでしょうね
倖郚パッケヌゞのためだけかず思っおたした
yesod界隈では{fast,monad}-loggerが䜿われおいたすが、䞀般的にロガヌを自分で遞択するずきは䜕を䜿っおいたすか