haskell-jp / questions #37

こんにちは。HRRの導入を検討しておりまして、質問があります。
HRR、動的に決まるテーブル名に対応していますか?

時系列データを日付ごとのテーブルに格納する要件がありまして、テーブル自体は実行時に作成されます。
これらのテーブルですが、テーブル名に日付が含まれる以外、カラムや各種制約はすべて一致しています。

以上よろしくお願いします。
同じく Haskell Relational Record に関する質問です。スキーマの取得時に、`defineTableFromDB` で 実際に(リモートの) DB に接続する代わりに、`mysqldump --no-data` で生成したスキーマのダンプのファイルを読み込む方法って無いのでしょうか?
TH を使って、コンパイル中にローカルで mysql を起動してファイルを読み込ませた上で defineTableFromDB を呼ぶ方法もあると思うのですが、もっと簡潔な手段があれば教えてくださると嬉しく思います。
HRR 人気!
HRR 攻略 wiki (違う)
typeとはそのtypeだったのですか。見落としていましたが、お陰様で助かりました。情報はありましたね :sob:
(<@U4LGTMTMK> 別件ですがこれの修正に deriveJsonNoPrefix が活躍しました。とても快適でした、ありがとうございました :bow: )
残念ながらなかったはずです。。。CREATE文のパースを避けるためにあのような方式にしていると伺ったことがあるので :disappointed:
ソース読んで頭の中で軽く型合わせをしただけなんで間違っているかもしれませんが、 Database.Relational.Relation.table 関数に Database.Relational.Table.table 関数にtable名と絡む名を渡して作った Table 型の値を渡すとできるはずです。

参考までにどこを調べたか共有しておくと、実際にその定義を生成している行が https://github.com/khibino/haskell-relational-record/blob/f2246bb4ac7272f27ed59e1caa36e5b00fe42f55/relational-query/src/Database/Relational/TH.hs#L220 にあります。
defineTableDerivations を呼んでいる関数を遡っていくと、チュートリアル http://khibino.github.io/haskell-relational-record/tutorial.html にも出てくる defineTable 関数にたどり着くのではないかと。
ただ、いずれにしても、日付名付きのテーブルを扱うという運用自体がSQLアンチパターン「メタデータトリブル」の匂いがするので可能ならば見直す検討はした方がいいかと思いますが。。。
(ご認識の上でしたら済みません...)
なるほど……。ありがとうございます!
これ ↓ 関連なんですが、base パッケージを Haddock ビルド(ドキュメント生成)したときって何かオプション指定しないと GHC が持ってる方の base パッケージに対してドキュメントが生成されるとかいうことありますかね?
https://haskell-jp.slack.com/archives/C4M4TT8JJ/p1547693188111300

起こっていることとしては、
• GHC のソース(base パッケージを含む)をダウンロードする
• 該当ソースコードを書き換える
libraries/basestack.yaml を配置する
stack haddock する
• 生成されたドキュメント(と HTML になったソースコード)を見ても変更が反映されてない

で、GHC が持ってる方の base を見に行ってるのかなぁと根拠のない推測をしてみたしだい

GHC が持ってる方の base を書き換えてみてみればいいか
どこにあるのだろう
そもそも、ソースコードの状態で(オブジェクトファイルとかじゃなく)持ってるんだろうか?
Haskellとは関係ないかもしれないけど、電子書籍版のThinking with typesを購入された方っていますか?
本当に購入したものがKindleで読めるのか知りたいです。(この規模の書籍をpdfで読むのは厳しいので)。
https://leanpub.com/thinking-with-types
なんか自分が勘違いしてるかもしれないんですが、PDF でも Kindle で読めるのでは?
おそらくEPUB版のことを言っているかと…
見た感じEPUB版のサンプルがないんですね…
そう、Epub版のサンプルがないからちょっと不安なんです:sob:
ハードカバー版もあるけど、送料が70ドルもするんですよね。。なので電子書籍版にしようかと
stackでHaddockを生成する方法は把握できてないのですが、環境設定でトラブルようでしたら、GHCを丸ごとビルドしてしまうのが手っ取り早いです。(CPUによって、30分から1時間くらいでビルド完了するはずです:slightly_smiling_face:)

ドキュメント生成込みでGHCをビルドするには、このあたりを参考にしてもらえるかと思います。
https://qiita.com/takenobu-hs/items/c1309b93ca17b87e5955#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%82%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88

あと、Dockerを使える環境の場合は、近い雛形のDockerfileを以下に置いています。
(そのDockerfileでは、ドキュメント生成をしない設定なので、mk/build.mkをドキュメント生成するように修正必要です。)
https://github.com/takenobu-hs/ghc-build-docker
やってみます!
あ、なるほど
自分の中では “PDF ⊂ 電子書籍” だったので変な感じがしてました
本当に初歩的な質問なのですが、MacBookのターミナルでghciをするときにファイル(例えば関数の定義する時など)を引用することはできるのでしょうか?ターミナルは一回一回消されるので、ファイルを引用する方法を知りたいです
ファイルの保存先はどこでもよろしいですか?
ありがとうございます。試してみます!
ファイルを :load したい場合はそのままファイル名を指定すればできます。
私はYesodで中規模webサービスを作っていますが,結局細かいところはReactとかを持ち出すことになるので,大規模になるとServantの方が良くて中規模までならYesodとかでサクサクっと書くのが良いのかなと思っています
https://www.ncaq.net/2017/12/03/00/00/00/
ありがとうございます:blush:
試しにこのような簡単な関数を作ってみたのですが、エラーが出ました。
doubleMe x = x + x

が書いてあるファイルの名前はなんですか?
baby.hsをhaskellというファイルに入れてます
関数名ではなくモジュール名かファイル名だと思います、
load baby.hs でうまくいきませんか?
:cd /path/to/directory で同じディレクトリーに要ることも確認してみては?
今外なので帰ったらやってみますね!ありがとうございます:blush:
0.1刻みのリストが欲しかったんですけど、何でこうなっちゃうかわかりますか?
浮動小数点数の演算の誤差です。たいていの言語で同じ結果になると思います。
> 0.2 + 0.1 == 0.3
False

後から 10 で割るといいですかね。
> map (/ 10) [1 .. 10]
[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
なるほど!ありがとうございます!
本当に誤差がないものがほしいならData.Ratioという有理数を使うと良いですよ
Prelude Data.Ratio> [0 :: Rational, 0.2 .. 1]
[0 % 1,1 % 5,2 % 5,3 % 5,4 % 5,1 % 1]
そんな便利なものが!あざす!
質問とかじゃないんですが、二分検索法で任意の桁数の平方根の近似を求めるコードを書いてみました。haskellを覚え始めたばかりでお作法をよくわかってないので、変なところがあればツッコミ入れてくれると嬉しいです。
https://gist.github.com/gaxiiiiiiiiiiii/00c6a9f7096e033a2ebbf007955ec96b
まず,Haskellコードとしての指摘なんですが:
• 現状だと []find に渡されると,このコードは止まらなくなります. 渡されないことを想定しているものがある場合,次のように明示的に書いておくといいと思います.

find _ [] = error "empty list"


• 関数適用は基本的に () で囲まなくて大丈夫だと思っておけば良いです.例えば今回の場合,

(length xs) `div` 2 == length xs `div` 2


と書けます.
ところで,アルゴリズム的な指摘なんですが, Haskell では [a] は単連結リストになります.(実際には Haskell の構文に違反するので書けないですが,擬似的には次のようなデータ型になります

type [a] = [] a
data [] a = [] | a : [a]

)
なので, splitAtlastlength は効率よくできるわけではなく, []: をパターンマッチでずっと紐解いていき所定の場所を見つけるみたいなことを行います.
なので,今回の場合

find :: Ord a => a -> [a] -> a
find _ [] = error "empty list"
find n [x] = x
find n (x:xs)
  | x * x >= n = x
  | otherwise  = find n xs


と書いた方が実は速いです.一般にリストに対して線形探索より効率の良い二分探索は書けず,データを作る際二分探索木にするなどデータ構造の方を工夫する必要があります.
あと根本的な問題として、任意の桁数を求める場合に Float を出力にしてしまうと結局桁あふれするのでは。。。 :cold_sweat:
https://haskell-jp.slack.com/archives/C5666B6BB/p1548231787206900?thread_ts=1548220064.205400&cid=C5666B6BB で紹介している Rational にするのを推奨します。
こうなりました。この場合はどうなんでしょうか?
で、not scopeと出たので、hsを無くしてやってみても、結果は変わりませんでした。
load じゃなくて :load ですね。。。GHCiの特別なコマンドは必ずコロン : で始まる点に注意してください。。。
ついにこうなりました笑笑
お二方、ありがとうございます!今飲み会空けで頭が回らないんですが、明日以降咀嚼します!
漠然と投げたのにリアクションがあって、凄く嬉しいです!!
can’t findになってますね、、、
この :point_down: 指摘のとおりではないかと。
https://haskell-jp.slack.com/archives/C5666B6BB/p1548172078203000?thread_ts=1548136855.190500&cid=C5666B6BB

import System.Directory
putStrLn =<< getCurrentDirectory


とGHCiに入力すれば、今いるディレクトリーのパスがどこかわかります。
(追記: パスに日本語が混ざっている場合を想定して、 :point_up: のコマンドを微修正しました。)
表示されたパスと、baby.hsがあるディレクトリーのパスが合っているか確かめてください。

もしかして、こうしたターミナルの操作をあまりやったことがない?