haskell-jp / questions #36

そうなんですよー。でもやろうとするといくつかの関数でリストを期待してるのに実際はTextだよってエラーが出るんです
僕がなにか見落としてるんですかね。。もうちょっと調べてみます
Text を Segment 型にパースしたいんですか?
そうです
おそらく、attoparsecの takeWhile みたいな物ですね http://hackage.haskell.org/package/attoparsec-0.13.2.2/docs/Data-Attoparsec-Text.html
takeWhile みたいなTextに特化したコンビネータを使うとattoparsecが速いよ(意訳)」みたいな事が書いてあるので、parsecでリストを経由しない手段は恐らく無さそう
確かmegaparsecならだいたいそのあたり解決してたかと思います…
なるほどー。ではParsecを利用する場合には今の実装(fromStringを多用する)である意味あってるんですね。
このモジュールの使い方が本当にわからない。
Text.Parsec.Text
http://hackage.haskell.org/package/parsec-3.1.13.0/docs/Text-Parsec-Text.html
@篠川 has joined the channel
stackで以下のプログラムを組んでコンパイルしたときに次のような感じになってしまったのですが原因などはわかるでしょうか?
実行結果
取り急ぎぱっと見でわかることを。Access Violationが発生すると言うことはGHCとか関連する何かのバグである可能性が濃厚ですね…
ただ、それ以前に、Access Violationの手前に出てくるエラーからしてC:\sr\snapshots 以下にあるファイルが壊れているように見えます。
一旦削除してやり直すと結果が変わるのではないかと。
あと、エラーメッセージもなるべくコピペしてください。
画像は困ります…
もしかしてコマンドプロンプトでのやり方が分からなかった?
あれからsnapshot以下のファイルを消去して再ビルドしてみましたが先ほどあげたエラーを出しました。
OSはどれでしょうか?Windows 7 64bit?
OSはwindows10です
64bitです

    <no location info>: error:
        Warning: Couldn't figure out C compiler information!
                 Make sure you're using GNU gcc, or clang
    Preprocessing library for Yampa-0.11..
    Building library for Yampa-0.11..
    `gcc.exe' failed in phase `C pre-processor'. (Exit code: 1)

これを見るに gcc か clang がない?
おっとすみません、同じエラーかと勘違いしてました(スマホで見ていたせいか気づきませんでした...)。
今出たエラーは https://haskell-jp.slack.com/archives/C5666B6BB/p1547767822135800 の方なんですね。
stack.yaml にはlts-12.16と書いているのにGHC 8.6.3が動いているように見えるのが気になりますね。。。 :thinking_face:
stack build --verbose したらどうなるのか気になります。
皆さんはemacsで何を使ってjump to definitionされてますか?
いい感じ飛べるようになりました :bow:
haskellをHTML内で使うときはどのコードを使えばよろしいでしょうか?また、そのときはAtomで使えばプログラムをシミュレーションすることはできるでしょうか?
HTML内で使う

どういったことでしょうか?ブラウザで表示とかを連想しました。
ghc-jsとかそういう……?
そうですね、元の質問 https://haskell-jp.slack.com/archives/C5666B6BB/p1547616849106800 にあった、外部のパッケージの定義まではジャンプできませんが、私もvimでタグジャンプを使うことが多いですね。
:thinking_face: .oO(Haskell IDE Engineでもできるらしいけどそういえば試してないな...)
JSPとかPHPでやっているようなことをやりたいんですかね?
どっかで聞いたことがある気もしますが、あまり使われていないように思います。
どちらにしてももうちょっと詳しく何をやりたいのか聞きたいですね。
私の知り合いであるエンジニアの方にhaskellは将来性があると言われやってみた所少しずつ基礎が付いてきたのでweb作りに実践してみよう。と思ったところなのですが。
Haskellでやる場合、Haskellでwebサーバーを書いて、blaze-htmlやtype-of-htmlを使って書き出したり、heterocephalusやmustacheなどのテンプレートエンジンを使ってやることが多いですね。
https://gihyo.jp/book/2017/978-4-7741-9237-6 の最後の方に載ってるwebアプリのサンプルが参考になるかと思います。
(Thanks @hiratara さん!)
僕はyesod使って勉強目的で簡単な掲示板作ったことがあります。
ただ次のことは本当に僕の個人的な思いですが、haskellは画面表示用データのJSON等を返すことに専念して(servantを使う) html, css, jsはvue.jsを使っていくのが理想的だと考えてます。B to Cだと特に。本当に偏見ですが、簡単なサイトなら良いですが、客が満足するレベルのフロントをhaskellのエンジニアが色々な意味で長期間に渡って作ってメンテし続けられるのだろうか・・・
@igrep ありがとうございます:blush:見てみようと思います!!
@ そうですか、、、やはりwebサイトはhaskellで作るのは難しいのですね。アドバイスありがとうございます:blush:
@take-cheeze has joined the channel
難しいわけでは全くありません
簡単ですし保守も楽ですよ。ただ
ただ僕がyesodでフロントエンドエンジニアと上手く連携してtoC向けのいい製品を開発してる事例を知らないだけという話になります。(僕も業務で使いたいので事例があれば教えてくれると嬉しいです)
了解です!ありがとうございます:blush:
確かにShoさんの仰るとおり、いわゆるSPAで作るような、高度なGUIを作るのは難しいです。GHCJSを使うとそこそこいけるかと思いますが、前例も少なくかなり大変でしょう。
ですが別に多少画面遷移が多いくらいで十分便利なものは作れるでしょうし、SPAの複雑さがないぶんむしろ簡単だと思います。
@igrep わざわざ追加コメしてくださりありがとうございます:blush:
Aesonによる失敗の説明文が詳しくないため特定に時間がかかりそうです。THやGenericで作られたFromJSONインスタンスを元にして(手書きは避けたい)詳細なエラーを書き出す方法などありませんでしょうか。
"Error in $: When parsing the record Message of type Web.Slack.Common.Message the key type was not present."

Scalaのcirceでは以下のようなエラーが出ます。
scala> parser.decode[User]("""{"id":1, "name_fuga":"taro"}""")
//res96: cats.data.Xor[io.circe.Error,User] = Left(io.circe.DecodingFailure: Attempt to decode value on failed cursor: El(DownField(name),false))

元URL https://qiita.com/ryoppy/items/664bd9a0dfd54ff1c6f6#decode
残念ながらありません。THで出したものもそれなりに詳しく出している認識ですが... :disappointed:
"Error in $: When parsing the record Message of type Web.Slack.Common.Message the key type was not present."
推測ですが type というキーがJSONに含まれてないものと読めます。
試しに https://github.com/haskell-jp/slack-log から持ってきた適当なJSONを元に、下記のような test.json を作って試したところ、同じメッセージを再現できたので、 「 type というキーがない」というエラーで間違いないと思います。

{
    "ts": "1541835316.110000",
    "text": "test",
    "user": "U4L0B71L1"
}


試したコードはこれ:

stack exec ghci
:m + Web.Slack.Common Data.Aeson
eitherDecodeFileStrict "test.json" :: IO (Either String Message)
(igrep さんの推測が合っているという前提で) なんか type という言葉がレコード型のキーだから使われているのか意味ある言葉として使われているのかわかりづらいですね
ですね... ダブルクォートか何かで囲っていて欲しいところですね...