haskell-jp / questions #5

それはコンパイルエラーになるということでしょうか?それとも,例外が出るということでしょうか?テンプレートが思った通りに表示できないということでしょうか?
@krdlab has joined the channel
import A() して export しても、instance が re-export されることを確かめました。
ありがとうございました。
{-# OPTIONS_GHC -fno-warn-dodgy-exports #-} と併用すると、警告がなくなるようです。
失礼しました。コンパイルエラーが出たので、
env = fromPairs ["list".= toJSON ["aa","bb","cc"]] としても[String]がToJSONのinstanceになっていない?などのコンパイルエラーがでました
edeは,大雑把にはテンプレートをJSONデータをパラメータにしてレンダリングするライブラリです.で,HaskellではJSONを扱うライブラリの金字塔として, aeson というライブラリ()があり ede でもそれを使用しています.(.=)はaesonの関数です.aesonは,Valueという型 () でJSONデータを表現しています.`fromPairs` は[(Text, Value)] というものから Value型の値を作る関数ですが,この関数はキーとその中身のJSONデータから新たなるJSONデータを作る関数 (イメージとしては, [("ab", { "a": "b" }), ("cd", { "c": "d" })] => { "ab": { "a": "b" }, "cd": { "c": "d" } } というような変換を行う関数)です.

まず一つ目ですが,aesonではToJSONという型クラスを用意しており,この型クラスには名前の通りJSONのデータへ変換できる型がインスタンスとして登録されています. (.=) は <キーとなるテキスト> .= <JSONになれる型の値(ToJSONのインスタンス)> という感じで使い,右の値は自動的にJSONデータに変換してくれます.なので, fromPairs [ "list" .= toJSON ["aa", "bb", "cc" ]fromPairs [ "list" .= [ "aa", "bb", "cc" ] ] と同値です.JSONデータとしての表現は, aeson と bytestring というライブラリをロードしてghci上で
>>> import Data.Aeson
>>> toJSON [ "aa", "bb", "cc" ] — Haskell上での表現が表示される

または
>>> import qualified Data.ByteString.Lazy.Char8 as BS
>>> BS.putStrLn $ encode [ "aa", "bb", "cc" ] — JSONデータが表示される

とすれば見ることができます

で,ここからは推測になるのですが,Haskell事情として文字列を表すデータ型にString型は扱いにくく(特に速度を求めるものでは) text というパッケージ() を代わりに使用されることが多くあります. aeson でも例に漏れずこのパッケージを使用しており, JSONのキーとしてString型ではなくText型というものを使います. なので fromPairs [ ("list" :: String) .= [ "aa", "bb", "cc" ] ] というのはコンパイルエラーを起こします. 正しい型は fromPairs [ (Data.Text.pack "list" :: Data.Text.Text) .= [ "aa", "bb", "cc" ] ] というのが正しい表記なのですがこのような書き方は良くするので, OverloadedStrings という拡張がよく使用されます.この拡張を有効にすると fromPairs [ ("list" :: Data.Text.Text) .= [ "aa", "bb", "cc" ] ] という表記が可能になります.
この OverloadedStrings はよく使う拡張なので, edeのドキュメントには書かれていないのですが, それを有効にしていないままドキュメントのサンプルを動かそうとするとエラーが出るはずです.この拡張を有効にしていなかったりしないでしょうか?
Thread Scope で Raw Events をテキスト検索(Ctrll+f)することはできないでしょうか? traceEvent で起こしたユーザイベントがどこにあるか探したいのですが。
現状では出来ないと思います。おそらく簡単に機能追加できると思うのでPR歓迎です。
OverloadedStringsは有効にしてあるのですがここでのData.Text.TextはData.Text.Lazy.Textの方ですか?
いいえ、strictのですね。うーん、OverloadedStringsが有効になってるなら、逆に fromPairs ["list" .= (["aa","bb","cc"] :: [String])] と書かなきゃいけない方ですかね?
:: [Data.Text.Text]で型指定してみます
あ、後説明の都合上Data.Text.Textと書きましたが、 import Data.Text (Text) してモジュール名指定無しで使用することを想定しているのでその辺は都度読み替えていただけるとって感じです :pray:
なるほど分かりました。ありがとうございます。PRは、余裕があればやってみたいと思います。
Textで型付けしましたが、実行してアクセスすると、eitherRenderにレンダリング不能と出力されました。
丸投げをお許しください:sweat_drops:(スレッドでソース作れません)
<!DOCTYPE html>
<html>
    <head>
        <title>{{ title }}</title>
    </head>
    <body>
        <h1>{{ title }}</h1>
        <ol>
            {% for food in foods %}
            <li>{{ food }}</li>
            {% endfor %}
        </ol>
    </body>
</html>


{-# LANGUAGE OverloadedStrings #-}

import Web.Scotty
import Text.EDE
import Data.Aeson
import Data.Text(Text)

main :: IO()

main = do

  path <- eitherParseFile "./html/index.html"

  let env = fromPairs [("title" :: Text) .= ("LIST" :: Text)
                      ,("foods" :: Text) .= (["AA","BB","CC"] :: [Text])]

  let txt = either error id $ path >>= (`eitherRender` env)

  scotty 3000 $ do
    get "/" $ html txt
ちょっと今試せる環境がないのですが、for文のとこは {% for food in foods %} <li>{{ food.value }}</li> {% endfor %} な気がします
あ…それですね。
出来ました!ありがとうございます
not.hot.red.pepper
@not.hot.red.pepper has joined the channel
not.hot.red.pepper
@not.hot.red.pepper has left the channel
becausethespiderspied
@becausethespiderspied has joined the channel
@bonotake has joined the channel
slack 初心者なんですが、`curl -sSL https://get.haskellstack.org/ | sh` すると、slack はどこに入りますか?
TLS 1.3 に対応した TLS パッケージをHaskellerじゃない人が使いたいそうで、ビルドする方法を書かないといけないの。。。
$ curl -sSL https://get.haskellstack.org/ | grep DEFAULT_DEST
DEFAULT_DEST=“/usr/local/bin/stack”
[ “$DEST” != “” ] || DEST=“$DEFAULT_DEST”
ありがたや。
(めちゃくちゃどうでもいいんですけど、slack と stack を typo してますよ(笑))
cabal clean; cabal build の代わりは stack clean; stack build ですか?
そうですね
ありがとうございます。
もしお時間があれば、これにパッと目を通していただいて、おかしなところがあれば、ご指摘いただけると嬉しいです。
以下コマンド列にて動作を確認しました.
$ docker run -it --rm debian /bin/bash
# apt-get update
# apt-get install -y curl sudo git
# useradd -m -G users,sudo -s /bin/bash test
# passwd test
# su test
$ cd
$ curl -sSL https://get.haskellstack.org/ | sh
$ which stack
/usr/local/bin/stack
$ stack setup
$ stack ghci
$ git clone https://github.com/kazu-yamamoto/hs-tls.git
$ cd hs-tls
$ git checkout -t origin/tls13
$ stack build
$ stack exec tls-simpleclient -- --no-valid --http1.1 www.mew.org 13443
stackについて、またまた質問です。あるパッケージを stack build するとします。依存しているライブラリは、githubの最新のものをとって来ないといけません。この依存って、どうやって指定するんでしょうか?
mighttpd2をビルドする際に、tlsとwarp-tlsの tls13 ブランチを使わせないといけないのです。
https://qiita.com/tanakh/items/6866d0f570d0547df026#stackyaml%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B
にあるとおり、
packages:
- some-directory
- 
- location:
    git: [email protected]:commercialhaskell/stack
    commit: 6a86ee32e5b869a877151f74064572225e1a0398

のように書いたりできます。
補足すると、本件の場合 extra-dep: true を明記しないと多分ダメですね。

- location:
    git: [email protected]:commercialhaskell/stack
    commit: 6a86ee32e5b869a877151f74064572225e1a0398
    extra-dep: true

:sweat: .oO(経験上、外部のリポジトリーを使う場合ほぼ間違いなく extra-dep: true するし、デフォルトでそうしてもいい気もしますが。)
stack 1.6.0 からもう少し簡単になりますよ。
Custom snapshots, 自前で作った新しいバージョンのパッケージの利用とか、GHCの新しいバージョンの利用とかが楽になりますね! :smile:
git は commit 書かないとダメなんですか? branch の先頭を使って欲しいんです。
強いて言えば stack clean 恐らく大抵不要だとは思いますけどね! :stuck_out_tongue_closed_eyes:
Note: it is highly recommended that you only use SHA1 values for a Git or Mercurial commit. Other values may work, but they are not officially supported, and may result in unexpected behavior (namely, stack will not automatically pull to update to new versions)

先ほどの公式ドキュメント曰く、だそうです。
tarballのURLでもいいみたいなんで、 https://github.com/kazu-yamamoto/hs-tls/archive/tls13.tar.gz みたいなURLを参照させるのはいかがでしょうか?
https://github.com/kazu-yamamoto/hs-tls/tree/tls13 にある、「Clone or download」というボタンをクリックすると出てくる、「Download ZIP」と書かれたリンクのURLをtar.gzに置き換えたものです。
後は、相対パスを決め打ちしちゃって、都度 git pull なりしてもらう、ぐらいですかね。。。