haskell-jp / questions #6

tar.gzを書くと、extra-depsの設定がないとか言われちゃいますね。
stack.yamlですが、ターゲットのパッケージのフラグはどのように記述するのでしょうか? 依存パッケージのフラグは書けるようですが。。。
それですが、stack.yamlを置いてあるパッケージ自体のフラグをどうやって書けばいいのか分かりません。
とりあえず、こんな感じになりました。
@notogawa わざわざありがとうございます!
ターゲットのパッケージのフラグを定義するってことですよね
cabal ファイルがそのまま使えますよ
stack.yaml はあくまでも依存パッケージなどのバージョンや場所を記述してるだけです(正確にはもっとイロンナことがかけますが…)
stack.yaml にパッケージ名と好きなフラグを定義して、各パッケージの .cabal でそのフラグを使って処理すると思います。

具体的にはこんな感じですか。

flags:
  tls:
    compat: true
    network: true
  tls-debug:
    xxxx: true
https://github.com/kazu-yamamoto/mighttpd2/blob/tls13/stack.yaml のことですかね?
いずれにしてもできたのであればよかったです!
ありがとうございました。
@matsubara0507 cabal ファイルのデフォルトを書き換えることで対応しました。トピックブランチだから、まぁいいやって感じで。
@khibino HRRの質問です。
Relation型のプレースホルダーはなんのために…あるんですか?
あと、ドキュメントにある $(defineTable "example.db" "account") の構文を教えてください。
個人的には、使いたいリポジトリをプロジェクト直下にsubmodule addしてpackagesに追加しちゃう事が多いですね
代わりに知っている範囲で答えちゃいます。
Relation型のプレースホルダーはなんのために…あるんですか?

SQLのPrepared Statementsを作るためのものだったかと思います。

あと、ドキュメントにある $(defineTable "example.db" "account") の構文を教えてください。

Template Haskellを使った、型定義の自動生成です、というので答えになってますかね?
Prepared Statements?ですか。
TemplateHaskellの構文なんですか経験がないのでわかりませんでした。
ありがとうございます:musical_note:
プレースホルダについては、SQLそのものに関わる機構なので、まずはSQLについて調べるのがよいかと思います。参考: https://qiita.com/Morinikiz/items/dfdb33f25df4df0f672c
@taketarou2 has joined the channel
Hakyllの質問です。pygmentizeを走らせたりするためにSystem.ProcessのreadCreateProcessを使ってIO StringをHakyll.Core.CompilerのunsafeCompilerでCompiler Stringに変換して使っていました。Hakyll.Core.UnixFilterのことを知ってそちらの方を使うように書き換えた所、`hGetContents: invalid argument (invalid byte sequence)`と出て上手く使えません。 にあるようにE.setLocaleEncoding E.utf8を使おうにも、IOとCompilerでは型が合いません。unixFilterを使うにはどうすればよいでしょうか?
FAQにもあるとおり、
hakyll に渡した do ブロックじゃなくて main 関数の中でやるのはダメなんですかね?
それがダメなら、 compilerUnsafeIO というのがあるみたいです。 https://hackage.haskell.org/package/hakyll-4.9.8.0/docs/Hakyll-Core-Compiler-Internal.html#v:compilerUnsafeIO
あるいは、 unixFilterLBS を使って、 ByteString として読んでみてはいかがでしょうか?
https://hackage.haskell.org/package/hakyll-4.9.8.0/docs/Hakyll-Core-UnixFilter.html#v:unixFilterLBS
あ、あと、FAQでは触れてないみたいですが、Windowsであれば chcp 65001 と言うコマンドを実行すれば回避できます。
Linuxと違って端末を立ち上げる都度実行しないといけないのが悩ましいですが。。。
返信ありがとうございます! unsafeCompiler = compilerUnsafeIO となっていますね、 unsafeCompiler (E.setLocaleEncoding E.utf8) >> unixFilter ... みたいな感じで使うということでしょうか? unixFilterLBS を使うのは確かに手ですね、両方試してみます。
お願いしますー
ちょっと今試す余裕ないんで自信ないんですが、 ScopedTypeVariablesでなんとかなる?
tomo426.sakura1281m
@tomo426.sakura1281m has joined the channel
runST 後の do 式の型を明示して forall s. して、それを中で使う形ですかね?
ホントだすごい
{-# LANGUAGE ScopedTypeVariables #-}

module Main where

import 
import 

main :: IO ()
main = print $ runST st

st :: forall s . ST s Int
st = do
  array <- newArray (0, 1) 0 :: ST s (STArray s Int Int)
  let
      go :: Int -> ST s Int
      go = readArray array
  writeArray array 1 1
  go 1
  -- go array 1
@matsubara0507 手柄は譲った! :bow:
@kakkun61 さんが質問したのか(笑)
こんがらがった(笑)
じゃぁ向こうにも書いておきます
@matsubara0507あ、ですです 分かりにくくてすみません
@igrep @matsubara0507ありがとうございました
実際に問題になってたコードはもうちょっと複雑だったんですがそちらも同様に解決しました
@ah has joined the channel
お騒がせしているstackですが、少し理解できました。依存パッケージだけ見えて、ターゲットのパッケージが見えないのは、

packages:
- location: .


を書いてないからでした。これは、.cabal ファイルへのパスだと思えばよいのですね。パス状にある .cabal ファイル全ての一覧を取得し、ファイル名をパッケージ名として扱うようです。
そうです! stack init とか stack new していれば自動でその部分はやってくれるはずですが、一から書いてしまいましたか。。。 :sweat_smile:
試しに`stack.yaml`を決して、`stack init`してみたけど、`stack.yaml`は作られません。
フラグの件ですが、`location: .` を加えたら、ターゲットのフラグも指定できるようになったようです。
stack exec foo で起動される fooがどこにあるか調べる方法はないですか? stack which foo とかできればいいのですが。。。
うーん、直接調べる方法ではありませんが、
stack path --bin-path して出てくるパスから調べることになりますかね。。。
あ、 stack exec which foo ならいかがでしょうか?
find .stack-work -name foo でうまくいかないかなぁ(笑)
stack exec which foo がよさそう。ありがとうございます。
find だと、`.stack-work`以外にあるコマンドが起動されていた場合に探せないのです。
Prelude の (^) の定義が多相になっているため、 phi^7 などと書くと「Integer に defaulting したよ!」っていう警告が出てしまうんですが phi^(7 :: Int) と書く以外に何か回避策ってあるでしょうか?
ただ警告を出さないだけなら -fno-warn-type-defaults というオプションがあります。ほかに試してみたところでは、 default 宣言を使って default(Int) としても警告は出てしまうようです。
とりあえず
import Prelude hiding ( (^) )
import qualified Prelude as Pre ( (^) )
(^) :: (Num a) => a -> Int -> a
x ^ y = x Pre.^ y
と再定義して回避しました。
@maru10tgg has joined the channel