haskell-jp / questions #102

cabal.project.local に相当するような stack.yaml のやつってありますか?
... Replies ...
いくつかのデータ型があらかじめ定義されており、それらはTLV(type length value)で統一的に符号化されるとします。
これに対する符号器/復号器の基本ライブラリを作りますが、データ型は将来追加されるかもしれないので、サードパーティライブラリで拡張可能としたいです。

まず、符号化のために以下のようなクラスを定義します。

class Typeable a => T a where
  typeT  :: Int
  encode :: T -> ByteString
  decode :: ByteString -> T
  fromTLV :: TLV -> Maybe a  -- TLVは後述
  fromTLV (TLV x) = cast x
  toTLS :: a -> TLV
  toTLS = TLV

既存のデータを表す型を A と B とすると、

data A = A ...
data B = B ...

instance A where
  typeT = 0
  encode = ...
  decode = ...

instance B where
  typeT = 1
  encode = ...
  decode = ...

これらの型を同じように扱えるように、 ExistentialQuantification を用いて、以下の型を定義します。

data TLV = forall a. T a => TLV a

符号器で encode を使うのは、 a が与えられるので簡単です。

encodeTLV :: TLV -> ByteString
encodeTLV (TLV x) = encode x

問題は復号器です。TLVのTとLの部分は ByteString に符号化された整数なので、それをパースして V の部分の ByteString を切り出した後に、適切な decode を呼ぶだしたいのですが、どうすれば呼べるでしょうか?

ぱっと思いつくのは、 Int -> ByteString の辞書を用意して、それを引くことです。拡張可能にするのは、この辞書を公開し、利用時に要素を追加可能にする必要がありそうです。

基本的に reflaction に関係する問題だと思います。サードバーティが data C を定義したら、自動的にその decode も呼ばれるような魔法はあるのでしょうか?
... Replies ...
Haskellそのものとは関係ない質問になるので恐縮ですがお聞かせ下さい

プログラミング初心者やHaskellの周辺に全く触れたことない人向けに一時間程度Haskellについて話す機会を得たのですが、皆さんならどういった内容を話すと良いと思われますか?
... Replies ...
ライブラリを書いており、テスト用にライブラリ内で定義した型の QuickCheckの Arbitrary インスタンスを作成しようと考えています。 Arbitrary インスタンスをどこに書くのが良いのかで悩んでいます。
このライブラリを他のプロジェクトから使った時にも Arbitrary インスタンスを使えるようにしたいので、テストコード側ではなくライブラリ側に書きたいと考えています。
しかし、インスタンスを書く為に必要な quickcheck-instancesライブラリがそれ自身を他のライブラリの依存パッケージとしないことを推奨しているため、「ライブラリ側に書く」のを躊躇しています。
別のライブラリとして記述するという方法もあると思いますが、それだと後々整合性を持たせるのを忘れそうなのであまり使いたくないなぁと思っています。

この場合どこに書くのが適切なのでしょうか
... Replies ...
@kohei wada has joined the channel
@ has joined the channel
Motoyuki Kimura (M.Kimura)
@Motoyuki Kimura (M.Kimura) has joined the channel
はじめて質問させていただきます。
Haskell学習中の者で、理解が進まない箇所があるのでお力添えいただきたく思います:man-bowing:
(続く...)
... Replies ...
@なっつ has joined the channel
現在作ろうとしているツールの一環として、「一定の文字列候補の中から、入力された文字列に一致する文字列をフィルタリングする」機能を作ろうとしています。
(最終的に作りたいものはrofiやdmenuと似たようなものです、というか具体的にはrofiクローンのようなツールを作ろうとしています)

このツールでは「文字列の一致」の判定方法をFuzzyやGlob、regex等複数から選べるようにしたいため、ツール全体のステートを維持する型の中に判定用の関数(matcherと呼ぶことにします)を含めたいです。

実際に今考えていたのは以下のような型です:

data AppModel = AppModel { _typing :: Text
           , _candidates :: Zipper Candidate
           , _configFile :: FilePath
           , _matcher :: (T.Text -> T.Text -> Bool) -- ^ ここのこと
           } deriving (Eq)

しかし、 AppModel はUIライブラリ()の都合で Eq インスタンスを持つ必要があるのですが、 Eq (a -> a) のインスタンスが存在しない故に定義が出来なくなってしまっています。

実装の仕方を自分なりに複数考えてみたのですが、どれも微妙でどれを選ぶべきなのか、またより良い方法は無いのかで悩んでいます。
何かしら定石みたいなものがあれば教えていただければ幸いです :pray:
(自分で考えたものはスレッドに書き込みます)
... Replies ...
@arark has joined the channel
@sashi has joined the channel
@ has joined the channel
@j.nakajima has joined the channel
@naoya has joined the channel
@mochizuki has joined the channel
@gnkm has joined the channel
ForeignPtrにcの関数をセットするaddCFinalizerToWeak#があるのですが、
呼び出しに200nsほどかかります。(条件によって変わってきますが。)
https://hackage.haskell.org/package/ghc-prim-0.5.2.0/docs/GHC-Prim.html#v:addCFinalizerToWeak-35-
https://gitlab.haskell.org/ghc/ghc/-/blob/master/rts/PrimOps.cmm#L832-871
どこにそんなに時間がかかっていると思いますか?
( LOCK_CLOSURE、updateRemembSetPushPtr、 recordMutableのどれかがほとんどの時間が使っていると思いますが。)
どうしたら内部の関数のマイクロベンチマークがとれますか?
... Replies ...
@Jake Lengyel has joined the channel
@ has joined the channel
すみだわら
@すみだわら has joined the channel
@Sasaki has joined the channel
Endo Ryunosuke / minerva
TaPL の exercise 30.4.2 に Are there any useful programs that can be written in System F4 but not in System F3? っていう問題があるのですが,思いつく人いますか?
... Replies ...
Nobuyuki Horiuchi
@Nobuyuki Horiuchi has joined the channel
Emacs (GNU Emacs 28.2 on macOS 12.6.1) の lsp-mode 上の hlsで 1500行程度のhaskell ファイルをよく弄るのですが、よくhlsがタイムアウト(10秒以内のリスポンスがない)したり、1関数タイプした後の変更の反映に数秒待たされたりします。これは他環境でも普通ですか?
... Replies ...
こんにちは。セグメント木を実装中で、型クラスのコンパイルエラーで困っております。
関連型の使い方が良くないみたいです (gist) が、どう直したら良いでしょうか……?
... Replies ...
@Ichiro Hasuo has joined the channel
↑ の続きの質問です。 `RMQ (ST S)` と `RMQ IO` を両方 `SegmentTree` のインスタンスにしたいのですが、エラーが出て困っております。
1. .. の場合>: Illegal type synonym family application のエラーが出ます。
2. : 2 つの実装の範囲が重なっていてエラーが出ます。
この件どう直せば良いでしょうか……? m(_ _)m
... Replies ...
@S.K. has joined the channel
GHCの新マイナーバージョンが出てからHLSの対応版がリリースされるまでタイムラグがあると思うんですが、皆さんどうしてますか?HLS対応の古いGHCを使う?
... Replies ...
Hiromi ISHII / mr_konn
対応版が出るまで待つことが多いですね(メジャーバージョンが同じで動くものがあればビルドだけ新しいのを使えば型周りのバグとかでない限りコンパイルは通るはずなので)。

新しいメジャーバージョンだったら自分でHLSをビルドしますかね。ghcupを使うとそれなりに自動でカスタムコンパイルできます https://www.haskell.org/ghcup/guide/#hls
@ya-poo has joined the channel
@yskoht has joined the channel
@kino has joined the channel
build=Linux x64, target=Linux arm32 (Raspberry Pi 2 B) なクロスコンパイル GHC をビルドする手順として今使えるもしくは比較的最新な情報を知ってる人いませんか?
... Replies ...
@佐々木哲 has joined the channel
@荒井柚月 has joined the channel
@ひらつか has joined the channel
@N gest has joined the channel
こんばんは。2 次元の動的計画法をシュッっと書きたいのですが、 ST モナドなどでハマっています。
お力添えいただけないでしょうか (スレッドに続く) 。
... Replies ...
@ has joined the channel
@ has joined the channel
@木村奏 has joined the channel
@HIJIRI KAWAI has joined the channel
LispやMLには方言がありますが、Haskellにはないのって、単にコンパイラが複雑になったからなのでしょうか?
モジュールや型などに関する関数型言語の実装一般に関する議論って、MLでは論文も多いですが、Haskellでは結構乏しい気がします
ここらへんの歴史的背景とか、最近の言語研究者の事情とかを知りたいです。
... Replies ...
@t.yamaguchi has joined the channel
@K.N has joined the channel
@miyamonz has joined the channel
@Yuto YOSHIDA has joined the channel
アクションゲームを作りたいと思っているのですが、この用途でおすすめされるライブラリはありますか?最悪キー入力とhtmlのcanvasみたいな操作ができればよいです
... Replies ...