haskell-jp / questions #85

(GHCはcabalではないので、 cabal.projectvector.cabal を読まないのは当たり前っちゃあ当たり前で、問題はprecompiled packageがGHCからvisibleでないことだけなのですが)
@HNish has joined the channel
stack build -> stack ghc でとりあえずうまくいきました! ただ, vector は project root 直下に <projectroot>/src/Data/Vector とあるのではなく <projectroot>/Data/Vector とあるので,project rootでコンパイルしようとすると cabal でも stack でも失敗するのは盲点でした (これを改善しても cabal だと失敗するのですが・・・.)
@akthrms has joined the channel
REPLと本番コードで有効な言語拡張が一致していないとか?
それはありそうだと思ってググったりもしたのですが、ghciから今有効になっている言語拡張のリストとか出せますかね。
:show language で出せるはずです
おお、出ました。ありがとうございます。
:setでも出る感じ。
あと思いつく原因としてはexportの範囲の違いが考えられますね どうもghciはpackageがexportしてなかったりimportしてない型も構わず出すようですけど, それを指定すると当然エラーになります
プログラムに付与したプラグマと合わせたけど変わらん。
gitrev パッケージって誰か使ったことのある方いらっしゃいます? Template Haskell 使って実行バイナリの中に Git revision hashを書き込んでくれる可愛いパッケージで、Option parser library (`<project root>/src/TheApplicationProject/OptionParser.hs` みたいなファイル)で --version の実装に使っています。ですが、 <project root>git checkout して stack build しても stack exec executable -- --version の Git revision hashが更新されないことが多数で、いちいち stack clean しないといけなくて困っています。`gitrev` の実装では addDependentFile.git/HEAD やらに対してちゃんと実行しているように見えるので、行き詰まってしまっているのですが、どなたかお心当たりのある方いらっしゃいます?
gitrev はメンテされていないので githash の方が良いかも?
https://github.com/snoyberg/githash
自己解決しました。
https://wiki.haskell.org/GHC/Type_families
この What is the problem? にある
GHC will happily infer the type g :: F a -> F a. But you can't write that type signature or, indeed, the more specific one above. (Arguably this behaviour, where GHC infers a type it can't check, is very confusing. I suppose we could make GHC reject both programs, with and without type signatures.)

でした。
そうか、GHC will infer the type, But You can't that type.
確かに very confusing だった。 :bomb:
ありがとうございます。しかし、この問題は gitrev 及び githash 共通の問題であることが発覚しました。 .git/HEAD が コミットハッシュである際には addDependentFile ".git/HEAD" されますが、 .git/HEADref: branch の際には addDependentFile "branch" のみが呼ばれ、 addDependentFile ".git/HEAD" は呼ばれないため、 git checkout では recompileはtriggerされない、という問題のようです。
どっちも「現在のブランチを取得する」関数持ってるので明確にバグですね・・・。
あとで適当にプルリク投げようと思います。お騒がせしました。
この件ですが、 そもそも .git/HEADref: branch\n であるところを drop 5 してブランチファイルを branch\n として検索した結果「ブランチファイルが存在してない扱いになる」ことが判明しました。面白かったのでお知らせします。
@kanshuyokoo has joined the channel
@natsuo has joined the channel
haskell-gi における、GObject Introspection の Haskellの命名規則に反する識別子名の取扱について他の方の意見が聞きたいので、質問します。
現状では、小文字始まりの識別子は先頭大文字化、その他はそのまま(例:`ABC` → ABC、`channelName` → ChannelName)なのですが、
これでは数字始まりの識別子名が扱えない為に、 にて、そのような定数名tk先頭が大文字ならそのまま、そうでなければ Const' を接頭(例:`ABC` → ABC、`channelName` → Const'channelName、`3270_Attn` → Const'3270_Attn )しようという話になっています。
恐らく GObject の識別子名には ' は用いることができないものと思われる(C言語において識別子名に ' は用いることができない故 https://twitter.com/na4zagin3/status/1262012340339265536)ので、この方針は機能するものと思います。
しかしながら、小文字始まりの定数名にも Const' が着くのは若干気持ち悪さがあったりしますし、他の方法等思いつく方等いらっしゃいますか?
完全に決めの問題なんで好みが大きいとは思いますが、厳密に名前の衝突を避ける必要があるなら Const' はよい案ではないでしょうか。
個人的にはさすがにそこまでしなくとも C' でよくない?という気はします。
いずれにしても、慣習として関わる人が納得できるものであればなんでもよいかと
Template haskellの再コンパイル時のdirtiness checkについて質問があって、 addDependentFile でディレクトリでない存在するファイルの変更・削除の追跡ができるのはわかるのですが、ディレクトリに対するファイルの削除・追加とか、ファイルの新規作成の追跡ってできないものでしょうか・・・。この前お聞きした githash だの gitrev だのにpull requestを書きたいのですが、Gitブランチの参照先の変化がファイルの新規作成によって起こる可能性があって、困り果てています。 https://haskell-jp.slack.com/archives/C5666B6BB/p1589353829140500
ありがとうございます! 私も C' で良いと思いますし、実質的に IBus バウンディングにしか影響が無いようなので、 C'にしてもらいました
@ny has joined the channel
@Setonai has joined the channel
@ has joined the channel
すみません、ちょっと詰まってしまったので質問させてください。
FreeBSD(12.1)上でncursesパッケージをビルドすると以下のようなエラーメッセージが出ます。

(Ver 0.2.16)
> >> cabal build
(略)
[4 of 5] Compiling UI.NCurses ( dist/build/UI/NCurses.hs, dist/build/UI/NCurses.o )
> lib/UI/NCurses.chs:442:27: error:
> * Couldn't match type `CWchar' with `CInt'
> Expected type: CWString -> IO CInt
> Actual type: Ptr CInt -> IO CInt
> * In the second argument of `withCWString', namely `(waddwstr win)'
> In the expression: withCWString str (waddwstr win)
> In the second argument of `($)', namely
> `\ win -> withCWString str (waddwstr win)'
> |
> 442 | withCWString str ({# call waddwstr #} win)
> | ^^^^^^^^^^^^
>
> lib/UI/NCurses.chs:447:38: error:
> * Couldn't match type `CWchar' with `CInt'
> Expected type: CWString -> IO CInt
> Actual type: Ptr CInt -> IO CInt
> * In the second argument of `withCWString', namely `(waddwstr win)'
> In the expression: withCWString (T.unpack txt) (waddwstr win)
> In the second argument of `($)', namely
> `\ win -> withCWString (T.unpack txt) (waddwstr win)'
> |
> 447 | withCWString (T.unpack txt) ({# call waddwstr #} win)
> | ^^^^^^^^^^^^
>
> lib/UI/NCurses.chs:725:53: error:
> * Couldn't match type `CWchar' with `CInt'
> Expected type: Ptr CInt
> Actual type: Ptr CWchar
> * In the third argument of `hsncurses_init_cchar_t', namely
> `cChars'
> In a stmt of a 'do' block:
> hsncurses_init_cchar_t
> (CCharT pBuf) cAttrs cChars (fromIntegral cCharsLen)
> In the expression:
> do hsncurses_init_cchar_t
> (CCharT pBuf) cAttrs cChars (fromIntegral cCharsLen)
> io (CCharT pBuf)
> |
> 725 | {# call hsncurses_init_cchar_t #} (CCharT pBuf) cAttrs cChars (fromIntegral cCharsLen)
> |
エラーメッセージにあるとおり、引数の型が合わないことが原因のようです。
FFIで呼び出すC言語の関数waddwstrはヘッダファイル(ncurses.h)では
extern NCURSES_EXPORT(int) waddwstr(WINDOW *,const wchar_t *);のように宣言されています。
しかし、c2hsでNCurses.chsがNCurses.hsファイルに展開されると
foreign import ccall safe "UI/NCurses.chs.h waddwstr"
waddwstr :: ((Window) -> ((C2HSImp.Ptr C2HSImp.CInt) -> (IO C2HSImp.CInt)))
となってしまいます。

どのあたりを確認すべきか、何かアドバイスがありましたら宜しくお願いします
Haskell入門するためにhaskell-ide-engineをVSCodeでやろうと思って公式のインストールをやったのですが、正しくインストールできているかわかりません。確認する方法はありますか?
試しに stack new なりを実行してプロジェクトを作って、そのプロジェクトを開いてエラーが起きないことを確認するのが一番でしょう。
hie自体はhie-wrapper path/to/Module.hsして動作確認できます
手元のLinux (Debian 10)で同じパッケージをインストールしても問題が発生しなかったので、FreeBSD版のncursesがどういう仕様になっているか、ですかね...
hie-wrapper path/to/Module.hsをしたところ、
Note: loading of 'Setup.hs' is not supported.
というメッセージが出ました。
これは正常に動作しているということなのでしょうか?
全文↓
2020-05-25 15:46:04.67934 [ThreadId 4] - run entered for hie-wrapper(hie-wrapper) Version 1.2, Git revision ee5b98c6bd3610ff90cb5373608a09c5813dcb69 (3829 commits) x86_64 ghc-8.8.2
2020-05-25 15:46:04.680157 [ThreadId 4] - Current directory:/Users/kent
2020-05-25 15:46:04.680199 [ThreadId 4] - Operating system:darwin
2020-05-25 15:46:04.680228 [ThreadId 4] - args:["path/to/Module.hs"]
2020-05-25 15:46:04.682433 [ThreadId 4] - Could not find a Project for file: /Users/kent/File.hs
2020-05-25 15:46:04.68252 [ThreadId 4] - Module "/Users/kent/File.hs" is loaded by Cradle: Cradle {cradleRootDir = "/Users/kent", cradleOptsProg = CradleAction: Direct}
2020-05-25 15:46:04.682561 [ThreadId 4] - Cradle directory:/Users/kent
2020-05-25 15:46:04.682781 [ThreadId 4] - Executing GHC on path with args: --numeric-version
2020-05-25 15:46:04.779279 [ThreadId 4] - Project GHC version:8.8.3
2020-05-25 15:46:04.779462 [ThreadId 4] - hie exe candidates :["hie-8.8.3","hie-8.8","hie"]
2020-05-25 15:46:04.779869 [ThreadId 4] - found hie exe at:/Users/kent/.local/bin/hie-8.8
2020-05-25 15:46:04.779931 [ThreadId 4] - args:["path/to/Module.hs"]
2020-05-25 15:46:04.779992 [ThreadId 4] - launching ....



Running HIE(hie-8.8)
  Version 1.2, Git revision ee5b98c6bd3610ff90cb5373608a09c5813dcb69 (3829 commits) x86_64 ghc-8.8.2
To run as a LSP server on stdio, provide the '--lsp' argument
Current directory:/Users/kent

args:["path/to/Module.hs"]

Looking for project config cradle...

2020-05-25 15:46:04.807328 [ThreadId 4] - Could not find a Project for file: /Users/kent/File.hs
2020-05-25 15:46:04.807789 [ThreadId 4] - Module "/Users/kent/File.hs" is loaded by Cradle: Cradle {cradleRootDir = "/Users/kent", cradleOptsProg = CradleAction: Direct}
2020-05-25 15:46:04.808 [ThreadId 4] - Executing GHC on path with args: --numeric-version
2020-05-25 15:46:04.940545 [ThreadId 4] - Executing GHC on path with args: --print-libdir


###################################################

Cradle: GHC session
Project Ghc version: 8.8.3
Libdir: Just "/usr/local/Cellar/ghc/8.8.3/lib/ghc-8.8.3"
Searching for Haskell source files...
Found 0 Haskell source files.

###################################################

Found the following files:



Load them all now. This may take a very long time.


###################################################
###################################################

Dumping diagnostics:




Note: loading of 'Setup.hs' is not supported.
2020-05-25 15:46:05.313744 [ThreadId 4] - done
詳細はわかりませんが、とりあえずインストールはうまくいっているとみていいと思います。
(追記)あとは使って確かめた方がよいかと
これでビルドできるようになると思います。
そうですね。ありがとうございます!
path/to/Module.hsはお手元のプロジェクトに合わせて適宜差し替えてください。プロジェクトによってはそのままではうまく動かないので https://github.com/Avi-D-coder/implicit-hie を使ってhie.yamlを生成した方が良い場合もあります。
ご回答ありがとうございます。
私もLinux(Ubuntu20.04)の環境で試したらビルドが通りました。動作も問題ないようです。
FreeBSD用?のパッチありがとうございました。早速あてて確認してみたいと思います。
結果は改めて報告致します。
頂いたパッチでビルドが通るようになりました。明日動作確認してみます。
ありがとうございまいました。
報告が遅くなりましたが、頂いたパッチでサンプルは無事動作しました。
なぜ展開結果が異なるのかは、時間があるときに改めて調査してみたいと思います。
@ has joined the channel
happyの、このFooパーサーの print $ parseFoo "x" を Right "good" に変える方法はありますか……??
お疲れ様です。
ghcのperformGCはGCの完了まで待たずに、実行をブロックしないものと思っていますが
これを完了するまでブロックするにはどうすればいいでしょうか。
コードを見るとghc/rts/sm/GC.cのGarbageCollectまで同期して実行していますよね。
ここで別のスレッドを呼んでいる?(よくわかってないです)のでブロックしないのでしょうか。
https://gitlab.haskell.org/ghc/ghc/-/merge_requests/3389
これとも関連しています。
「Haskell入門 関数型プログラミング言語の基礎と実践」10章にあるWebアプリケーションの作成で使われているspockは、今でも推奨されるライブラリでしょうか?
長らくstackageにも入ってないようですし、更新も止まっているもののステータスがわからないと言いますか…
一応ltsのバージョン下げれば(本書と一致させれば)できるだろうことはわかっているのですが気になりました