haskell-jp / questions #35

でもTemplate Haskellだとコンパイル時になってしまうから、実行時はさすがにないはず...
https://codeutopia.net/blog/2011/08/20/adventures-in-haskell-dynamic-loading-and-compiling-of-modules/ リンクベタ付けで悪いけど、これ改良すればいけそう? でも、ただのハックになってしまいそう、、、かなーと思ったり
これはさすがにimportではないんじゃないかなーって気がしますね。。。
まぁ、これは実行時評価に近い気がしますがこんな感じでGHCのインポートプロセスをハックできそうな気がしたので、、、
@kenta.teruteru has joined the channel
@keikagawadesu.7k has joined the channel
初めてプログラミングを始めたものです。かなり初歩的なとこで質問するかもしれませんが、よろしくお願い申し上げます:man-bowing:
https://api.slack.com/methods/conversations.history
↓のようなJSONの ts をaesonでパースしたいのですが、インスタンスを定義したいんですがエラーがでます。どんな対応がありますか?

{
            "type": "message",
            "user": "U061F7AUR",
            "text": "What, you want to smell my shoes better?",
            "ts": "1512104434.000490"
        }


/Users/sho/src/github.com/shokohara/automerge/slackworkcount/src/Main.hs:30:10: error:
    Duplicate instance declarations:
      instance FromJSON LocalTime -- Defined at src/Main.hs:30:10
      instance FromJSON LocalTime
        -- Defined in ‘aeson-1.4.2.0:Data.Aeson.Types.FromJSON’
   |
30 | instance FromJSON LocalTime where
   |          ^^^^^^^^^^^^^^^^^^
エラーメッセージ自体は、 LocalTimeFromJSON インスタンスが二個定義されているといってます
自分でインスタンスの定義をしなければ良いので?
返信ありがとうございます。フォーマットが違うため自分で定義してみました。
なるほど、それは難儀ですね…
いくつかやり方がある気はしますが、もっとも行儀の良いやり方は newtype 宣言で LocalTime をラップした型を定義して、それを使う方法ですかね…
ちなみに、 http://hackage.haskell.org/package/slack-web にも同様のパーサーがすでに定義済みかと思いますが、それではダメなんですか?
この「->」で、この場合aがBoolを返すことはわかったのですがなぜもう一つaがあるのでしょうか?
画像見にくくてすみません。
(>)の型表記は、型制約を示す (Ord a) => の部分と、引数および返値を表す a -> a-> Bool の部分に分かれています。
(>) は 2つの比較可能な値を取って、その大小をBoolで返すため、 a を2つ取る必要があります。
2つの比較可能な値はa.bで表すのではないのでしょうか?2つの値を取った上で、Bool値を、返す。ということではないのかと思ったのですが
これが例えば (Ord a, b) => a -> b -> Bool のように定義してしまうと、例えば aIntbString のようなものを比較可能になってしまいますよね。これを (Ord a) -> a -> a -> Bool と定義することで、片方の型を入力するともう片方の型を自動的に固定して、同じ型でなければ比較できないという制約を作り出すことができるのです。
ほんとにわかりやすいです笑笑ありがとうございます:blush:
これが謎で他のものも理解できなかったのでこれで一気にわかると思います笑笑
返信ありがとうございます。
newtypeの方法を勉強も兼ねて試しました。ありがとうございます。
slack-webに乗り換えを検討しています。教えてくださってありがとうございます。ただ、乗り換え中に Left (SlackError "invalid_ts_latest") という実行時エラーがでるようになり、この通信をデバッグしたいのですが、どのようにするのが良さそうでしょうか?(Java,Scalaだとlogback.xmlなどを書き換えたりしますが、、、)
残念ながらそうしたlogback.xmlのような設定ファイルはありません。
Haskellでは、そもそも外部のパッケージには何もログが仕込まれていないのが普通です。
直接やりたければ、ソースコードをダウンロードして、書き換えた上でstack.yamlで参照するしかないです。
そしてそのエラーは、Slackのサーバーが返しているものなので、通信をデバッグしてもあまり実のある結果にはならないような気がしますね。。。
大方、 LocalTime をJSONに変換した結果の文字列が、Slackが受け付ける文字列になっていないというエラーかと。
$を使った関数適用の
($) :: (a -> b) -> a -> b
の部分なんですけど、()を$として使うのになぜ、aやbを使って関数を定義するのでしょうか。また、aとbということはそれぞれ違う型の値ということでしょうか?
昨晩ソースをたどってみたところ、UrlEncodedFormにNothingのものは文字列のnotingがtimestampに入っていくところを確認したので、それが原因っぽいなと検討はつきました。
質問の意図をくみ取れているのかわかりませんが、($) は関数 f :: a -> b と、その関数に渡す引数 x :: a と取って関数適用した値 f x :: b を返すと読めます。a と b は同じ型でも問題ありません。たとえば f として id を渡す場合などです。
了解です。ありがとうございます:blush:
この質問は,なぜ($)を言語要素としてではなく関数として用意するのか,ということでしょうか.(解決済みでしたらすいません.)
調査方法を教えてくださってありがとうございます :bow:
interoで M-. によって Jump to definition したいのですが、
instance ToForm HistoryReq whereToForm の定義に飛ぼうとすると http-api-data-0.3.8.1-CLVb2SyagwA9bGtbONTDYI:Web.Internal.FormUrlEncoded のように表示されます。この挙動は intero では当然のものでしょうか?
https://github.com/shokohara/slack-web/blob/master/src/Web/Slack/Common.hs#L82
ソースコードにジャンプしたいです
@sugano さん。わざわざ考えてくださって感謝します!!もう解決したので大丈夫ですよ!
This message was deleted.
僕は自動化したいことをリストにまとめていて、暇になったらそれに着手します。例えばSlackやGitHubから情報を集めて業務報告文の自動生成です。作っておけば自分が楽になるもの等にやる気がでます。
ありがとうございます!ぜひ実践したいと思います!
今回は特に消す必要もないですが、さすがにあまりにもHaskellから離れた質問になってしまっているので、今後はここでは控えていただきたいです。 :pray:
了解です。申し訳ないです。
一応迷惑にもなるので消しときます。申し訳ないです。
チャンネルの趣旨からは外れるかもしれないけど私はこれは結構重要な疑問なんじゃないかと思いますね。変に浮世離れしたイメージを持たれがちなHaskellのユーザはどんなモチベーションでプログラミングに取り組んでいるのかというのは、回答を募る意味があると思う。
そう、だから迷ったんですけども... :cold_sweat:
@keikagawadesu.7k 僕はScalaの業務委託案件でご飯食べてますが、Haskellのしかたも踏まえた上で現場により良いコードを提供したいという思いを持って細かいツールをHaskellで作ってます。自分の評価にも繋がることとより希少な人材になれると信じて取り組んでます。
ごめんなさい。自分性格的に中途半端なことが嫌なので、消すか消さないかということで、1人でも困ってる方がいましたら消す考えになってました。もしそれがダメであったら申し訳ないとしか言えないです。
@shokohara 自分まだまだ始めたばかりですが、将来のことを考え、また自分を評価してくれるというのはとても良い考えですね。参考にさせていただきます!!
自分を評価してくれる

これは妄想ですけどw多分より良い評価に繋がる気がしてます
まぁ、もう遅いんでいいです。
どちらかというと私は「あまりにもこういう質問が増えるのはおそらく好ましくないので注意する。でも前例を残すためにも消さない方がよい」という立場でしたが、「消すな」ということをちゃんと明言するべきでした。すみません。
変に浮世離れしたイメージを持たれがちなHaskellのユーザはどんなモチベーションでプログラミングに取り組んでいるのかというのは、回答を募る意味があると思う。
もし本当にそういう意図があっての質問だったのであれば、そう明言していれば私も特に注意はしなかったと思います。
たしかに前例を残し他にこのようなことがなくなるという面では消さないという案もありでしたね:cry:もう消したものは戻らないので、次から気をつけたいと思います。わざわざ忠告してくださり感謝致します:man-bowing:
ごめんなさい。このアプリhaskellのために入れたものであまり使い方を分かっておらずこちらのメインの方にもコメ欄行ってしまいました。すみません:man-bowing:
@ktchg752 has joined the channel
@kilo7998 has joined the channel
ParsecってTextを返すコンビネーターを提供をしていないのでしょうか。
http://hackage.haskell.org/package/parsec-3.1.13.0
Stringをパースするのなんかやだなと思って色々やってるんですけど、どうしてもうまく行かなくて、最終的にパースしたものにfromStringを適用してTextに変換してます。
https://gist.github.com/HirotoShioi/f75a547ff2730f7905a6b9a40d2d675d#file-inlineparser-hs-L21
parsec って任意の型にパースできないっけ?