haskell-jp / questions #103

ghc-bignum ってデフォルトが native になってますけど, これを gmp にしようと思ったら ghcup でGHCをインストールする時点でなんとかしないといけないですか…?
... Replies ...
@ has joined the channel
GHC 9.4 で stdc++ に依存するようになってしまったようですが、その理由はなんでしょうか?
centos だと、configure が stdc++ を見つけられずに、インストールできません。。。
... Replies ...
@kk has joined the channel
@gan20 has joined the channel
@HN has joined the channel
@まど has joined the channel
@ai-ou has joined the channel
@yoshitsugu has joined the channel
https://haskell-jp.slack.com/archives/CL3AXB1AL/p1675402815431589 (at atcoder-lang-update)
がんばりました。直接installしていない物も含む、全transitive dependencyのライセンスのリスト: 
この件で,あるパッケージ群の全transitive dependenciesからlicenseを取ってくる作業をしたのですが,私の知識の範囲でできる限り車輪の再開発を避けて:
1. cabal-installにdependencyを解いてもらい,
2. それをもとにHackage API を叩いて .cabal ファイルをもらってくる,
3. Cabal-syntax パッケージを使ってその .cabal ファイルをパースしてライセンス情報を取る
みたいな手段を取りました.この1.に関して質問させてください.

ここでやりたいことは,「ビルドやインストールはしなくていいけど,現環境から見た,既ビルドのものも含めた全transitive dependenciesのリストが欲しい」ということになります.このために今回は結構乱暴な手段を取りました.Docker環境があったので,まっさらなGHC+Cabalをghcupでインストールしたのち,対象のパッケージ群を全部 cabal install --lib して ghc-pkg list でインストールされている全パッケージのリストを取ってきたのです.しかし,これでは余計なパッケージまで見ている気がしますし,もうちょっとなんとかならんのか,という気がします.

色々いじっていると,適当に一個だけcabal packageを持つcabal projectを作り,Cabal packageの .cabal ファイルは目的とするパッケージ群をdependenciesに持つ library だけを持つようにし,project の cabal.project にはそれらのライブラリについて設定すべきフラグを持たせるようにすると, cabal freezecabal.project.freeze がなんかそれっぽいファイルになるのですが,これで合ってるのでしょうか…? cabal freeze が良い方法なのか,あるいは別の方法があればお教えいただければありがたいです.
... Replies ...
RIOパッケージをbase代替として取り入れています。
RIO.Utf8Builder の値を ロギング用途ではなく 標準出力に吐き出すには何を用いるのが良いのでしょうか?
具体的にやりたいこととしては、情報を標準出力に出力するCLIツールを作ろうとしています。
今はとりあえずTextやByteStringに変換した後に putStrLn 等で出力をしているのですが、他により良い方法があったりしますか?

【現状の方法だった場合: ByteStringにするべきかTextにするべきか】
Text or ByteStringへの変換をする場合、どちらの方が良いとかあるでしょうか?それともあまり考えなくて良いのでしょうか
最初は`textDisplay` が用意されていることから、Textを使うべきなのかな?と思っていました。
しかし、`RIO.Utf8Builder`が内部的には Data.ByteString.Builder.Builder を用いているようなのでByteStringの方が良いのかな?とも考えて悩んでいます。
... Replies ...
@mocamocaland has joined the channel
@h r has joined the channel
GHCの管理が phabricator から gitlab になり、例えば
https://phabricator.haskell.org/D4884
のようなリンクが追えないのですが、gitlabへはどう変換されているのでしょうか?
... Replies ...
代替Preludeを使いたいと考えているのですが、新しくてまとまっている比較記事などはありますか?
... Replies ...
GHC 9からTemplate Haskellでinstanceを定義する時に相互参照が出来なくなってコンパイルが通らなくなったという問題を抱えているのですが、この破壊的変更がどこかにまとまってる場所や、より良い回避方法を知っている方は居ますか?
具体的にどういうことが起きているのかは自分のサイトに書きました。
GHC 9からTemplate Haskellでinstanceを定義する時に相互参照が出来なくなった - ncaq
... Replies ...
言語拡張 CPP を指定したソースコードの確認のために、CPPの処理だけが済んだ段階のソースコードを出力したいと思うのですが、ghc オプション指定でできないものでしょうか?
... Replies ...
@Greg Fragin has joined the channel
ふと思ったのですが,GHCの compiler backend (LLVMとかNCGとか)って機械語吐くのに必要なんだから,ライブラリだけビルドする時って無関係,なんでしたっけ…? こういう時どういう資料を漁ればいいかよくわからなくなってしまって.
... Replies ...
@フラワー has joined the channel
あるpackage の executable 中に入っている module の関数が欲しくて、copy-and-paste するつもりなのですが、こういう時って LICENSE ファイルを複数作るか、追記するか、どうするのが普通なんでしょう?
... Replies ...
@ has joined the channel
@kudos3939 has joined the channel
@西澤秀樹 has joined the channel
@Hisawo TAKASE has joined the channel
https://haskell-jp.slack.com/archives/CL3AXB1AL/p1680155886899719 の関係で strict-wrapper のコード () を読んでたんですが,ここの strictunstrict 関数が怖いことをしていると思うので,皆様のご意見を伺いたいです.参照先のコードは大体

data SPair a b = SPair !a !b

strict :: (a, b) -> SPair a b
strict x = case x of
  (!_, !_) -> unsafeCoerce x

unstrict :: SPair a b -> (a, b)
unstrict = unsafeCoerce

のようなことをしており,これって SPair a b(a, b) の runtime representation が完全に一致しているということを主張している気がするんですが,そんな保証ってありましたっけ…?
... Replies ...
GHCupって、使用するGHCなどのバージョンをディレクトリーによって置き換える機能はないのでしょうか?ざっとドキュメントを読んだ限り見当たらなかったので。GHCはcabal.projectなどで簡単に切り替えられるからいいんですけど、ghcupでインストールされるhaskell-language-serverがバイナリーを付けてくれないバージョンだったもので...
... Replies ...
Hiromi ISHII / mr_konn
IDEが用いるバージョンの固定であれば、VSCodeならhaskell.toolchain 項目で具体的なバージョン集合を指定できますね。HLSの公式バイナリが対応していないバージョンのGHCを使う場合はghcup compile機能で自前でHLSをビルドして、そのカスタムビルドのバージョン文字列を指定して使ったりしてます。
他のエディタでも多分使えるはずだとは思いますが使ったことがないのでわからないですね
ghc-heapってbundled versionでないものを使うと不具合は起こるのでしょうか…? なんの気なしにdependencyに入れたらcabal-install が GHC-9.4.4 上に ghc-heap-9.6.1 を引っ張ってきている…
Windows 11 の WSL Ubuntu に ghcup で、stack を含む開発環境をセットアップしたのですが、stack new hoge をすると
Downloading template new-template to create project hoge in directory hoge/...

Error: [S-1688]
       Stack failed to download the template new-template from
       .

       While downloading, Stack encountered an HTTP error. Stack made the request:

       Request {
  host                 = ""
  port                 = 443
  secure               = True
  requestHeaders       = [("User-Agent","The Haskell Stack")]
  path                 = "/repos/commercialhaskell/stack-templates/contents/new-template.hsfiles"
  queryString          = ""
  method               = "GET"
  proxy                = Nothing
  rawBody              = False
  redirectCount        = 10
  responseTimeout      = ResponseTimeoutDefault
  requestVersion       = HTTP/1.1
  proxySecureMode      = ProxySecureWithConnect
}


       and the content of the error was:

       ConnectionTimeout

となります。wsl あるいは windows 11 の問題のような気もしますが、もし、なにか対処法にヒントがあれば教えていただけると幸いです。
ネットワークは繋がっていますし、wget で https://api.github.com/... にも繋がるように見えています。
... Replies ...
@光志賀 has joined the channel
@ has joined the channel
@Keonhwa Ryu has joined the channel
@ has joined the channel
M1 の mac で AArch64 の GHC をお使いの方:
network パッケージのビルドに異常に時間がかかりませんか?
cabal build で hsc2hs が走るのですが、これがとても時間がかかるような気がしています。
.hsc から .hs ができさえすれば、コンパイルには時間がかからないようです。
... Replies ...
MacOS 13.3.1 on Intel Mac 上,built-in の terminal 上の bash で,GHCup を使って cabal-install 3.8.1.0 と GHC 9.4.4 をインストールした状態で,自作のcabal packageに対して cabal v2-install を実行すると GHC のコンパイル時警告が握り潰されるのですが,原因特定・解決のためには何をすると良いでしょうか? cabal v2-build を使うとコンパイル時警告が握り潰されないこと, このPC上,Docker container上の Ubuntu で同様の環境を作成したときにも同様の事象が発生することは確認しているのですが,どうも同様の環境を再現しているはずの AtCoder 実行環境では GHCのコンパイル警告は正しく表示される () ようなのです.
GHC9.2.7を使っています。
type familyを用いて型レベル計算をしようとしており、他のtype familyの結果の型レベルタプルの複数要素の値を計算で使いたいです。
通常の関数であれば、タプルをletで束縛してからfstなりsndなりで結果を得られますが、type familyで同じようなことをするにはどうしたらよいですか?
... Replies ...
状況がよくわかってないですが、以前に型レベルでタプルを使ったとき、以下のようなものを用意したことがありました。
type Term a = a -> Type
type family Eval (e :: Term a) :: a
data Fst :: (a, b) -> Term a
data Snd :: (a, b) -> Term b
type instance Eval (Fst '(a, b)) = a
type instance Eval (Snd '(a, b)) = b

具体的に、値レベルの場合let文を使えば下のコードのようにmydivmod一回の呼出しでタプルの両方の値を束縛して使えますが、同様のことををtype familyの定義中で行いたいです:
data MyNat = MyZero | MySucc MyNat deriving (Show, Eq)

mydivmod x y =
  case x of
    MyZero    -> (MyZero, MyZero)
    MySucc x' -> 
      let (d, m) = mydivmod x' y
      in  if (MySucc m) == y
          then (MySucc d, MyZero)
          else (d, MySucc m)
@EtoAl has joined the channel
型レベルのバインディングは書けないので、以下のようにパターンごとに分けて定義することになります。再帰の場合は反復形(末尾再帰?)で定義するほうが定義しやすいと思います。
data Nat
    = Z
    | S Nat

type family (m :: Nat) + (n :: Nat) :: Nat where
    Z + n = n
    S m + n = S (m + n)

type family (m :: Nat) - (n :: Nat) :: Nat where
    Z - n = Z
    m - Z = m
    S m - S n = m - n

type family Cmp (m :: Nat) (n :: Nat) :: Ordering where
    Cmp Z     Z     = EQ
    Cmp Z     (S n) = LT
    Cmp (S m) Z     = GT
    Cmp (S m) (S n) = Cmp m n

type family DivMod (m :: Nat) (n :: Nat) :: (Nat, Nat) where
    DivMod m n = DivModIter Z (Cmp m n) m n

type family DivModIter (d :: Nat) (o :: Ordering) (m :: Nat) (n :: Nat) :: (Nat, Nat) where
    DivModIter d o   Z     (S b) = '(d  , Z)
    DivModIter d 'EQ (S a) (S b) = '(S d, Z)
    DivModIter d 'LT (S a) (S b) = '(d, S a)
    DivModIter d 'GT (S a) (S b) = DivModIter (S d) (Cmp (a - b) (S b)) (a - b) (S b)

type N2 = S (S Z)
type N5 = N2 + S N2

これで、たとえば
>>> :kind! DivMod N5 N2
DivMod N5 N2 :: (Nat, Nat)
= '( 'S ('S 'Z), 'S 'Z)

ですかね。
@Archgen has joined the channel
@tedzuka has joined the channel
こんばんは。アプリカティブの合成? をポイントフリースタイルで書く方法を教えてください。
【やりたいこと】
~`f arg = fst <$> monadicTuple arg` という関数 `f` を、 `arg` を省略して書きたいです。~
※ f は 2 変数関数 `f arg1 arg2 = fst <$> monadicTuple arg1 arg2` でした。

【試したこと】
`f = fmap fst . monadicAction` はコンパイルエラーになりました。よろしくお願いします _(._.)_
すみません、自己解決しました……! 2 変数関数だったのが問題でした。
2 変数関数が絡むポイントフリースタイルは、別途調べます!
... Replies ...
```fix1 :: ((b -> c) -> b -> c) -> b -> c
fix1 = fix
fix :: (a -> a) -> a
fix f = flip fix1 f $ \g h -> _```
`fix`を`fix1`で定義したいのですが,上の`_`に当てはまる式として以下のどれが適切でしょうか?
```1. f $ g f
2. f $ g h
3. h $ g f
4. h $ g h```
いずれも下記のテストを通過しました.上記1-4のいずれかが失敗するテストも併せて募集します.
```print $ fix $ const () -- ()
print $ flip fix 5 $ \rec n -> if n == 0 then 1 else n * rec (pred n) -- 120```
... Replies ...
@bbmallow has joined the channel
@ has joined the channel
parsecで構文解析器を作っています。対象ソースコードのどこに構文エラーがあるのか表示したいです。
構文解析器はトークナイザからの出力を受け取り、その構文を解析します。
tokenize :: Parsec String () [Token]
syntaxAnalyze :: Parsec [Token] () SyntaxTree

という型になります。
一回トークナイザを挟むとそのトークンがソースコードの何行何列目にあるかの情報がなくなり、tokenPrim関数でSourcePosの計算ができません。これってどうやって解決したらいいでしょうか?TokenにSourcePosを含めるとパース処理の他に位置計算が含まれるのでコードが読みにくくなるのであまりやりたくないなぁと思っています。

どなたかお教えいただけると非常に助かります!
... Replies ...
@Lefl has joined the channel