haskell-jp / questions #76

ありがとうございます。みてみます。
ご教示のとおりmysqlのプログラムのままで動きました。ありがとうございます。
https://github.com/ringo-apo/hs_mariadb
こんにちは。
HaskellからMariaDBを操作するにはどうしたらよいでしょうか。
ググって見たのですが、MySQLの情報はあっても
MariaDBの情報は見つけられませんでした。
参考になるサイトなどお分かりでしたらご教示頂きたく。
https://github.com/yesodweb/persistent
はドライバはMySQLという名前ですがMariaDBで使っている人が結構居るみたいですね
私はPostgreSQL派なので使ったことは無いのですが,
そのまま互換性のあるMariaDBでも動くのではないでしょうか
ありがとうございます。みてみます。
ご教示のとおりmysqlのプログラムのままで動きました。ありがとうございます。
https://github.com/ringo-apo/hs_mariadb
vscode で Haskell Language Server のプラグインを使っての開発環境を作っているのですが、コードを編集する度に `"print-build-platform" (exit 1): failed` というエラーが出てうっとおしく思っているのですが黙らせるにはどうしたら良いのでしょうか。

ネットに転がっている記事を読んみたところ `export PATH=$(stack path --compiler-bin):$PATH` を ~/.bash_profile に書き込むと解決するらしかったので試してみたのですがダメでした…。
役に立つかわかりませんが参考になりそうなコマンドのログ貼っておきます:sweat:
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.6.5

$ stack path --compiler-bin
~/.stack/programs/x86_64-osx/ghc-8.6.5/bin

$ which hie
~/.local/bin/hie

$ ~/haskell-ide-engine/.stack-work/install/x86_64-osx/hogehogehoge/8.6.5/bin/cabal-helper-wrapper "print-build-platform"
x86_64-osx
あ、すみません、何故かはわからないのですが以下のオペレーションやったら何故か解決しました:thinking_face:
1. ブラウザからDLした古い verison の vscode を rm コマンドで削除
2. brew cask install visual-studio-code
https://github.com/input-output-hk/plutus/blob/master/example/shell.nix
nix-shellするだけで
vscodeとhieとghcのセットアップが完了したりしないですかね。(まだ試してないです。)
http-clientの`Network.Http.Simple.httpJSON` について質問です

ステータスコードによって異なる内容のJSONを返すAPIを叩こうとしています。()
ステータスコードが200なら Right、それ以外なら Leftに包んで返したいです。
しかし responsegetResponseBodyを使うと、強制的に成功時の型として扱われてパースできずにエラーになってしまい、困っています。
自分で思いついた解法は、「 httpJSONの代わりに httpLbsを使い、最後値を返すときにJSONとしてパースする」くらいなのですが他に方法はあるのでしょうか
以下のコードです:
usersShow :: APIRequest -> ReaderT MisskeyEnv IO (Either APIError User)
usersShow req = do
    env <- ask
    initReq <- parseRequest $ (env^.url) ++ "/api/users/show"
    let requestObject = object [ "userId"   .= (req^.userId)
                               , "userIds"  .= (req^.userIds)
                               , "username" .= (req^.username)
                               , "host"     .= (req^.host)
                               ]
        request       = initReq { method = "POST"
                                , requestBody = RequestBodyLBS $ encode requestObject
                                , requestHeaders =
                                      [("Content-Type", "application/json; charset=utf-8")]
                                }

    response <- httpJSON request
    case getResponseStatusCode response of
        200 -> return $ Right $ getResponseBody response
        400 -> return $ Left  $ getResponseBody response -- APIError型になって欲しいけどならない
ちょっとすぐに調べられる状態ではないので推測ですが、4XXや5XXだと例外が投げられるのでcatchせよ、という仕様じゃないかと思います。
この場合tryの方がいいですね。理由は忘れちゃいましたが一般にcatchよりも推奨されてたはず
@ has joined the channel
parseRequestを使っているのでステータスによる例外は発生しないはずです。まず`Value` 型として取得し、`fromJSON` でさらに変換するのはいかがでしょうか
なるほどすみません、問題を誤解してました:sweat_drops:
実質fumiさんの方法と同じですがFromJSONのインスタンスを:point_down:️のように定義すればいいかもしれませんね。

newtype EitherJson a b = EitherJson (Either a b)

instance (FromJSON a, FromJSON b) => FromJSON (EitherJson a b) where
  parseJSON v = EitherJson <$> (Right <$> parseJSON v) <|> (Left <$> parseJSON v)
:thinking_face:.oO(そう言えばこれの値コンストラクターが3つ以上のバージョンを会社の同僚が欲しがってたな。割と需要あるだろうからパッケージにしてもいいかも)
なるほど、ありがとうございます!
とりあえず試してみます(コードは書き直したものの、他の場所がエラー出てて試せていない)
これは初めて知りました:sweat:
@tk has joined the channel
@tsubo has joined the channel
遅くなりましたが、
fumievalさんの方法でやってみて上手く動きました〜!
igrepさんのは理解するのに時間がかかってしまった…
お二人ともありがとうございました!
Haskell で簡易的なスケジューラーを作りたいんですけど、オススメ、あるいはデファクトスタンダードなパッケージとかってありますか?
(ここでのスケジューラーってのはプログラムを起動しておくと定期的に任意の関数なんかを実行してくれるプログラムのことをイメージしてます)
もう間もなく、すごいH本の写経が終わるのですが、次に読む書籍のオススメなどあれば教えていただけますでしょうか?個人的にはより実践的な内容だと嬉しいなーなんて思っております:sweat:
https://gihyo.jp/book/2017/978-4-7741-9237-6 がオススメです。
入門と言いつつ入門詐欺と言われるくらい入門者には難しいし、アプリケーションの例が豊富なので。
ぬおー、なるほど!
ちょっと怖いですが読んでみようかなと思います!
あ、はい、もちろん cron を使えば実現できるんですけど、Haskell プログラムだけでできないかなって
これはいかがでしょうか。
おぉ、cron というパッケージでしたか、失礼しました :bow:
ありがとうございます。試してみます :+1:
@kuwana-kb has joined the channel
@Masaki Ono has joined the channel
@yoshi has joined the channel
https://qiita.com/Dooteeen/items/fbfaf4fd513066ecc554#comment-e0c17b34a7f1453f0d5e のコメントを書いていて気になったんですが、リストの foldr'Data.List にない(`Data.Foldable` から import すれば使えますが、普通使うことはないはず) のってなんででしたっけ?
多分こうだろうというイメージはあるのですが、自信を持って説明できません...
Data.Foldable.foldr'の定義はトリッキーでややわかりにくいですが、foldr' (+) 0 [1,2,3]は、 +!を右から評価するものとして表すと`1 +! 2 +! (3 +! 0)` のような形になります。結局、この式を評価するには最後まで辿ってスタックを消費せねばならず、メリットがないからだと言えます
リストに対してパターンマッチする度に x : xs における xxs の分だけスタックを消費してる、というイメージで合ってますかね?
+! がeagerにパターンマッチするからリストの長さだけスタックを消費してる、と。
それは事実ですが、パターンマッチ関係なしに、1 +! rを評価する際、1を残したままrを先に評価するので1がスタックに残ります(再帰的にも同様)
https://github.com/haskell-jp/playground/blob/master/Strictness/Fold.hs playgroundにpushしてみました。やはりfoldr'が一番イヤな感じにコンパイルされている…
exL = exL'

ってことは foldl' (+) 0 [1..1000]foldl (+) 0 [1..1000] は同じ式として最適化されたってことですか... 正格性解析の結果でしょうか... すごい。
cf. https://qiita.com/autotaker1984/items/09c5ceaa13e9077f5359
部分適用したりしない限りは、どちらでも良さそうですね
@Dora has joined the channel
@maina has joined the channel
@matsuzono has joined the channel
@カーメ has joined the channel
@tanaq has joined the channel
@yaza_ta has joined the channel