haskell-jp / questions #72

添付の例で期待した結果が得られません
ターミナルで実行すると [" とだけ表示され、あとは Ctrl+C するしかない状態になります
最終行の (c:r) の部分が犯人らしいことは分かっているのですが
どういうわけなのでしょうか
最終行
    (l,(c:r)) = break (== c) str

の左辺の csplit の引数の c ではなく、新たに束縛される変数の名前となります。そして、その新たに束縛された c break (== c) で参照されます。つまり、その行は
    (l,(d:r)) = break (== d) str

と書いたのと同じ意味になります。
直し方ですが、この場合は break の結果の2番目の最初の文字は必要ないので、単にワイルドカードで受けて
    (l,(_:r)) = break (== c) str

と書けば良いでしょう。
@yuuuuusuke0210 has joined the channel
@nakamurajun69 has joined the channel
ここで訊くのが妥当か分からないのですが...
Text.Regex.Posix を用いた正規表現についてです
以下の最終行で値が返らないのは何故でしょうか?
> import Text.Regex.Posix
> "2019/09/30" =~ "([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})" :: Bool
True
> "2019/09/30" =~ "([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})" :: String
"2019/09/30"
> "2019/09/30" =~ "([0-9]{4})?/([0-9]{1,2})/([0-9]{1,2})" :: Bool  
True
> "2019/09/30" =~ "([0-9]{4})?/([0-9]{1,2})/([0-9]{1,2})" :: String
"2019/09/30"
> "2019/09/30" =~ "([0-9]{4})?/?([0-9]{1,2})/([0-9]{1,2})" :: Bool
True
> "2019/09/30" =~ "([0-9]{4})?/?([0-9]{1,2})/([0-9]{1,2})" :: String
"

なお、西暦や月を省略した日付にも対応するパターンを作りたいというところです
取り急ぎ。Text.Regex.Posixの正規表現エンジンがどうなってるかわからないので推測ですが、正規表現の組み合わせ爆発が起きているのではないかと思います。
でも無限ループに入ってしまっているとしたらバグっぽいなぁ。
手元で試したところ、結果は返りました。どのバージョンをお使いですか?


> "2019/09/30" =~ "([0-9]{4})?/?([0-9]{1,2})/([0-9]{1,2})" :: String
"2019/09/30"
因みにここでいう結果が返らないは空文字列が返されるという意味ですよね?
私が手元で試したときは、無限ループにハマってしまってました。
上げていただいた出力例が " だけで終わっていることからして、satunさんの手元でもそうなっていると思われます。
肝心のパッケージのバージョンですが、私の手元では :point_down: でした。
regex-base-0.93.2
regex-posix-0.95.2
同じく regex-base-0.93.2, regex-posix-0.95.2 です :thinking_face:
バージョン同じくです
値が返らないの意味は、igrepさんの仰る通りです
あとはOSと、GHCのバージョンでしょうかね... :thinking_face:
私はWindows 10で、GHC は8.6.5です。
@mail048 has joined the channel
@shingo_okawa has joined the channel
stack build --ghc-options '-ddump-splices' ってどのディレクトリーに出力されるんでしたっけ?
.stack-work を掘れ、とだけありますね...
あと、 https://github.com/commercialhaskell/stack/pull/4242 のおかげで --ddump-dir というオプションが stack build にできてるはず!
そうそう、その PR 見ておっと思ったけど手元の stack 1.9.3 にはまだなかった
(依存ライブラリーが stack 2 でビルドできなくてって 1.9 使ってる
とりあえず ~/.stack-work を掘るのじゃ(今手元ではHaskellのプロジェクト触ってないので面倒くさい)。そんなに難しいところではなかったはず
@uemkam04 has joined the channel
こんばんは
OSX 10.14.6でGHC7.10.3用にinteroをビルドしようとしてるんですが、`Guess: You might need the "tinfo" package, e.g. libtinfo-dev.` と言われてinteroを入れられません。どうしたらいいでしょうか?
https://twitter.com/shokohara_/status/1179957099675054080?s=20
https://twitter.com/shokohara_/status/1179968733105672193?s=20
問題の解決ではないのでアレですが、私はAtCoder用コードの動作確認は最新のGHC (8.6.5)でやってます。GHC 8.0以降で追加された言語拡張を使わないこと、モノイド周りの関数を使うときはData.Monoidをimportすることに気をつければだいたい大丈夫です。うっかりでCEをやらかしてもペナルティーはつきませんし、提出してCEが出たら直す、というやり方で大抵は問題ないと思います。(直前の提出のCEに気づかず解けない問題にチャレンジして数十分経過、なんてことになると悲惨ですけども)
libtinfoはLinuxっぽい響きですし、その「Guess:」は的外れなguessだと思います。interoのソース https://github.com/chrisdone/intero/blob/bab8e85b1aea9b03dfe05048bcdc0395e05e9b20/elisp/intero.el#L2252 を見た感じ、インストールに失敗すると無条件に「Guess: tinfoがどうのこうの」というメッセージを出すようですし。
そのGuess云々のちょい上あたりで新しいhaskelineとかを入れようとして,古いghc-7.10.3とbaseバージョンが合わないためinteroのビルドは失敗します.ghc-7.10.3時代のlts-6.29あたりに合わせて,そこを
           "haskeline-0.7.2.1"
           "ghc-paths-0.1.0.9" "mtl-2.2.1" "network-2.6.3.1" "random-1.1" "syb-0.6"))

とかに変更すると,interoのビルドが成功するようになります.この際 intero.el の隣りに intero.elc がある場合,これを消しておかないと上記変更しても読み込む設定が何も変わらないので注意してください.
ただし,この変更すると逆に今度は新しいresolverに対してinteroがビルドできなくなるかもしれない?ので,何か適切に工夫するなり諦めるなりしてください.
本来 intero.el は,このあたりのバージョンをハードコードしてしまうのではなく.要求されたresolverから対応するltsに含まれる各パッケージバージョンを採用するようにすべきかもしれません.
私は時間のある時に過去問を解いたりしてるだけですけど同じく8.6.5で大抵はokですね。
ただやっぱりTLEした時にprof取って手元で改善してもsubmitすると無力だったりすることが多いので参戦するなら合わせておいた方がいいとは思うな。
AtCoderが対応するまでの間、8.6.*のHIEで簡単にコンテストに参加したり過去問の練習をしておこうと思いました :bow:
皆さん本当にありがとうございます
Macは詳しくないですがtinfoはncursesの機能の一部なのでncursesのバージョン5を入れたり拡張ライブラリを入れることでなんとかなるかもしれません
mod_poppoさんも書いてますが別の理由で失敗してもtinfo云々が出るという的外れなエラーメッセージなのでなんとかはなりませんね
失礼.ちゃんと読めていませんでした.
algebraic-graphsのData.Graph.LabelledのGraphにOverlayがなくてConnect zeroで代用してるのってなんでなんですか
@wasabi.nvim.st has joined the channel
答えになっていなくて恐れいりますが,論文のほうでもedge-labelledなグラフについてはFuture workとしているようです.(なので,仮の実装なのかもしれません…?) 誤りでした. :bow: 意図的にそのように定義しているようです
Overlayのあり方についてはいろいろ議論されているようですが…
度々すみません,2018年にLabelled-edgesに関して発表されているようです(今見てます…)
https://skillsmatter.com/skillscasts/12361-labelled-algebraic-graphs#showModal?modal-signup-complete
動画を見ました.私なりの質問への答えは以下になります.

辺ラベルを持つグラフをくっつけるとき,「辺の重複をどのように解決するか」,「連続する2つ以上の辺のラベルをどのように解釈するか(例えば,重み付きグラフの場合は辺の重みからパスの重みを算出する需要があったりします)」といった問題への対処が必要になります.

Andrey氏は,ラベルをSemiringと見なすことで,複数の需要(辺を容量とみなしたり,距離とみなしたり)を満たそうとしています.このとき,Semiringにおける零元を持つ辺は「辺がない」ことを表しているようです.

Overlayは2つのグラフを単に重ねる操作ですが,辺が重複する場合のことが(Unlabelledでは)考えられていません.そこで,辺が重複する場合はSemiringになっているラベルの加法を適用するというアイディアを採用しているようです.例えば,距離の重みがついたグラフでは,距離が短い方を採用したりできます.

Connect e は2つのグラフ間の全部の辺にラベル e を付与する操作(ちょっと自信ないです…)ですが,Connect zero とすることで,2つのグラフの辺の間に「辺を張らない」ことを表現できます.

以上が私の理解でした…どなたか補足していただけると幸いです.
@yosuke.kaneko has joined the channel
@shohei.takaichi has joined the channel
今, bytestring をちょっといじってるんですけど,パッケージの構成moduleをちょこちょこ書き換えたあと,Cabal fileのdependencyにダメージを与えていないこと……つまりdependencyの全組み合わせでビルドが通ることってどうやって検証すればいいですかね.
これってbytestring 依存している各パッケージのいろいろなバージョンでビルドしてみたい、ってことですよね?
そうであれば、bytestringは調べた限りGHCに組み込みのパッケージにしか依存していないようなので、色々なバージョンのGHCでビルドしてみるのがよいかと
ああ,なるほど. bytestring ならそれでいいですね.ありがとうございます.……世のパッケージ作者さんがたは,こういうテストどうやってるんだろう…….
全部やってる人は見たことないですね
stackage前提ですが複数のltsをCIにマトリックス設定してテスト通ればOKってやってる人が多いですね
@monji4869 has joined the channel
有向非巡回グラフを扱う良い/メジャーなライブラリ教えてください
algebraic-graphの scc :: Ord a => AdjacencyMap a -> AdjacencyMap (AdjacencyMap a)適用すればdagになるし僕の目的的には良いかな
最近標準ライブラリのData.Graph()使ってみて,そのときはbuildGとtopSortだけ使っただけですが足りた.
Stateモナドの型についてなのですが、
すごいHaskell楽しく学ぼうでは`s -> (a, s)`と書かれているのに
stackageで見つけられる`State`は`s -> (s, a)`と書かれていて混乱しています。()
更にいうと`state`関数については`(s -> (a, s)) -> m a`の型になっていてもう混乱してきています…()
そもそも`state`に関しては様々な場所で定義されている名前のようですし()、今見ているのが正しくない可能性もあるのですが…

これは、バージョンアップで変更されたと考えていいんでしょうか?それとも何かしら私が読み違えている…?
(ちなみにこんなことをしているのは、純粋に興味本位でStateモナドを自分で書いてみているというだけなのであまりにも複雑な話があれば諦めます)
一般的にStateといえばmtlのものだと思いますし(初心者なので間違ってる可能性は高い)、最初のものに関してはcontainersパッケージで内部的に使われるものっぽい
ちょっと趣旨違うけど、まえに紛らわしいねって話してた
https://haskell-jp.slack.com/archives/C4M4TT8JJ/p1563328807116600?thread_ts=1563328807.116600&cid=C4M4TT8JJ

(ここの趣旨は internal な定義は Hoogle でフィルターしたいって点)
:point_up: のとおり、 containers パッケージの作者が mtltransformers に依存したくないな、と思って独自に定義しただけのものなので、全く気にしなくていいです。
ありふれた定義を元ネタのパッケージに依存しないで自前で定義しちゃう、というのはHaskellコミュニティーではよくあることです。
(特に lens パッケージが提供する諸々はそうする前提で作られています)
依存関係を増やさないために敢えてDRYにしない、っていう。
containers パッケージの件については、こういうときはせめてコピペにして欲しかった... :disappointed:
なるほど…
つまり、実際に使われているのはこれ↓という認識でいいですか…?
https://www.stackage.org/haddock/lts-14.8/mtl-2.2.2/Control-Monad-State-Strict.html#t:State
思ったよりも複雑な作りになっている…というかStateTが先に定義されてるのか…