haskell-jp / questions #27

うーん、なんででしょう...
コピペミスしてるわけでもないみたいですし…うーん…
これもまたフラグが必要なものだったりしますか?
BangPatterns
LambdaCase
が必要です。
BangPatternsをつけたらビルドできました!
(Nil,0)
(Bool True,1)
(Bool False,2)
(UInt8 1,3)
(UInt16 2,5)

おかげさまでやりたかったことができました!遅くまで本当にありがとうございました!
ちょっと前出てきたすごい長い英語のHaskell入門書ってなんていうんでしたっけ。書名が出てこない... :thinking_face:
Get programming with haskell ですか?
多分それです!確か割とお勧めされてましたよね?
僕はまだ読んでる途中なので、まだレビューできていないです:innocent:
http://haskellbook.com/ のことだったかも!まぁ両方紹介しとくか!
質問です。遊びでRedditのようなものを作ってたのですが。`Comment`のArbitraryインスタンスで躓いています。。
https://gist.github.com/HirotoShioi/94367f655bd0fb00e5acb27be1ed29eb
runSumComment 100
と実行するとランダムなコメントをn個生成してその統計を取っているのですが、StackOverFlowで実行エラーになります。

data Comment = Comment
    { cId          :: !Integer
    , cAuthor      :: !User
    , cParentId    :: !(Maybe Integer)
    , cPoint       :: !Int
    , cDescription :: !Text
    , cResponse    :: ![Comment]
    } deriving Show


原因はcResponseがコメントのリストだからねずみ講の要領でとんでもない量のコメントに膨れ上がってるからだと睨んでます。
できればコメントの返信の総数を200以下に留めたいのですが、それは可能なのでしょうか。
総数ではなく深さを200に制限することになりますが、愚直にやるなら

arbitrary = go 0
 where
  go depth = do
    ...
    cResponse <-
      if depth == 200
        then pure []
        else vecorOf listLen $ go (depth + 1)
    pure Comment {..}


ですかね。
(総数も各 cResponselength をとって足し合わせればできるかな...?)
あとは自分で試したことがないので自信がないのですが、 http://hackage.haskell.org/package/smallcheck を使えば大きさを指定した上でのテストができます。
「任意の文字列のコメントに対してテスト」みたいなことはできなくなってしまいますが。
ほかには、 cResponse! を外すとメモリ消費量はめっちゃ増えそうですがstack overflowはしないかもしれません。
( :warning: これも試さないで想像で言ってます!)
igrep さんのやり方でもいいと思いますが、 sizedscale を使うのがより正当なやり方かもしれません。 http://hackage.haskell.org/package/QuickCheck-2.11.3/docs/Test-QuickCheck-Gen.html
arbitrary = scale (min 200) $ sized $ \size -> {- 最大でsize個のcResponseを持つCommentを生成する処理-}

(今手元に環境がないのでコードは適当です)
@mrsekut has joined the channel
ありがとうございます!`size`のことに関して調べてみます!
ICFP行く人います?
HIWとHaskell Symposiumだけ行きます。 :raised_hand:
確か @khibinoさんは本体も参加されるんでしたっけ?
@insight1111 has joined the channel
行きます!strangeloopも参加します。
mapM, filterM, じゃ物足りなくて、maximumByMとかなんでも欲しくなりません?
そりゃあやろうと思えばfoldMで書けるんでしょうけども。
あとずいぶん前に insertWithKeyM も欲しくなったかなぁ。
なんかいい方法ありませんかねぇ。
@ has joined the channel
ちょっと困ってるんですが、みなさん stack --resolver lts-12.9 repl --package iCalendar-0.4.0.4 --package mime-0.4.0.2 と実行したらどうなります?
(特にMacの人)
https://www.reddit.com/r/haskell/comments/9f5ovv/link_error_with_icalendar0404/
全く同じエラーみたいですね。。。
再現性が高いようで良かった。
Macですかね。やっぱりLinux版とよく似たエラーですな。。。
シンボルテーブル見ると未定義となっており入ってない. Paths_iCalendar モジュールのシンボルなので,
が原因?
確かに https://github.com/chrra/iCalendar をcloneしてビルドすると
<no location info>: warning: [-Wmissing-home-modules]
[ 1 of 10] Compiling Paths_iCalendar  ( .stack-work\dist\7d103d30\build\autogen\Paths_iCalendar.hs, .stack-work\dist\7d103d30\build\Paths_iCalendar.o )
    These modules are needed for compilation but not listed in your .cabal file's other-modules: Paths_iCalendar

などと出ますね。
ああー、報告されてた。これっぽいですね!ありがとうございました!
https://github.com/chrra/iCalendar/pull/30
ICFP 行きます。
こちらの質問に関連している論文が、今度のHaskell Symposium 2018に投稿されてましたので共有いたします。
再帰的なデータ構造の Arbitrary をどうするか、というのは結構難しい問題みたいでして。
https://arxiv.org/pdf/1808.01520.pdf
おお、ありがとう。連休中に読んで見ます。前に講義の課題でトライ木のArbitraryインスタンスを定義してたなーと思って見直したらえらい難解でした。。
https://gist.github.com/HirotoShioi/94ca87534be2144250fa10b61c7ce0d8
Persistent PostgreSqlに関する質問です。
以下の記事にそって`createdAt UTCTime default=CURRENT_TIME`と設定しました。
https://www.yesodweb.com/book/persistent#persistent_attributes

しかしマイグレーションの際に以下のエラーメッセージが出力されます。

*** Exception: SqlError {sqlState = "42804", sqlExecStatus = FatalError, sqlErrorMsg = "column \"created_at\" is of type timestamp with time zone but default expression is of type time with time zone", sqlErrorDetail = "", sqlErrorHint = "You will need to rewrite or cast the expression."}


これに対する回避策はあるのでしょうか。
ありがとうございます。やってみます。なにやらTimeZoneに関する記事がリンクされてますので、それも読んでみます。
Postgresでは,timestamp型のデフォルト値用にCURRENT_TIMESTAMPとnow()がサポートされています(なので,CURRENT_TIMESTAMPを使っても良いと思いますね).
https://www.postgresql.jp/document/10/html/functions-datetime.html
いけました!ありがとうございます。
調べてみるとpostgresqlにおけるcurrent_timeはその日の時刻のみ(日付はない)返すようです。。
@yuga has joined the channel
@kiridaruma has joined the channel
@ has joined the channel
@ has joined the channel
catchAnyDeep, tryAnyDeepより更に評価を強制する関数ってありますかね。。
これらの関数を用いてもキャッチできない例外があって困ってます。(しかも部分関数からの例外です。。
なんとか解決できました!
HackerRank の Substring Diff https://www.hackerrank.com/challenges/substring-diff/problem の Haskell での解法を教えて下さい Python ならば通る方法(2次元のテーブルを作り二分探索)を使うと n = 1500 のテストケースで Data.Array メモリーエラーになりました
書いてみたけど TLE なってしまった