haskell-jp / random #11

ああ、説明が足りませんでした。
構文木を評価した結果の型を以下のようにして、型の構造はシンプルなままにして外側から注釈をつけられるような Functor として扱えないかなって取り組んでみたのです

hs
data ValF a
  = Unit
  | Bool    Bool
  | Integer Integer
  | List    [a]
  | Func ([a] -> Either Error a)

ビルトインの関数やラムダ式を Func にあてがう用途に足したのですが、この時点でFunctorの導出は出来ないなって気づいて
aはアノテーションにして,型情報とかを入れたい感じですか?
Func の型の意味がよく分かってないんですが, ([a], Either Error a) ではなくて関数型なんです?
更にコレを newtype Fix f = Fix (f (Fix f)) でラップすると、外側から中に注釈を差し込めるっていう感じです
Func はhaskellの方で実装しているビルトイン関数本体を渡すように考えていて eval する時にそれを適用させてインタプリタを実装する、という目論見でした。
ここの “Adding basic primitives” の項に書いてあるような感じ https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours/Evaluation,_Part_1
https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours/Defining_Scheme_Functions
こっちの方が近いかもです。この例の LispVal のように、関数をメンバーに持たせて、apply の型を Val -> [Val] -> Either Error Val という風にしたかった
うーん,それは,
type Val = Fix ValF
eval :: Val -> Either Error Val
...
eval (FunApp name xs) = buildinf name xs

みたいな実装になる気がしたのですが(ビルトインをeval時に埋め込むなら),Funはどういう感じの実装になるんでしょう?(ちょっと察しが悪くてすいません)
あー分かりました.ListがFunAppなんですね(Lisp脳じゃなかった).evalのシステムはFunctorなくても実装できそうな気がするんですが,ValFに関して何かトラバースがしたい感じなんでしょうか?
ValFに、「何も注釈つけてない版」でテストを書いて、AstからValFに変換する時にはシンボルの位置情報をつけたり、型推論の結果を注釈側に足したり、って言う風にしたかったんです。もちろん素朴にValの構造をコピペして LocatedVal とか TypedVal とかを作っても同様の事が出来はするんですが、ボイラープレートの山が出来るし…
印象としては,Func fというデータで関数fは注釈情報を受け取ることは想定してないように見えるんですが,想定してるんですかね?想定してるなら,確かにうまくなんとかしたい感じはあるんですが,想定してないなら
  ...
  | Func ([Val] -> Either Error Val)

apply (Func f) args = <argsから注釈抜いて[Val]に変換したのを適用する>

みたいなんが正しそうな気がするんですよね
ありがとうございます、確かにそうだった。後で試してみます
ついでに、この手のテクニックって結構紹介されていて、 

ekmett さんのライブラリでも Fix-Functor の組み合わせでTHのライブラリ作っていたりします
https://github.com/ekmett/recursion-schemes/pull/23
ASTでcofree annotationを使ったことはあるんですが,実行時表現をそれで作るのはあまりやったことなかったです.
(個人的にFixの辛いとこは,type synonymを使わなきゃいけないのも合わさって,型エラーがやばいことになるとこだと思ってるので,素直にannotation変数追加してDeriveFunctor使っちゃうことも多いです)
たぶん実行時表現まで(本当はAstそのもの使いたい)そうしたがってしまうのはLispっ子ゆえの悪癖かもしれない…
3/19(月)にオープンハウスがありますので、興味のある方は是非〜
https://preferred-networks.connpass.com/event/79219/
@maru8m has joined the channel
話がちょっとそれて、cofree が何か知らないんですが、この ↓ AST って cofree 使ってるんですかね
この PDF 読みながら実装してるんですが http://www.cs.ru.nl/~W.Swierstra/Publications/DataTypesALaCarte.pdf
https://github.com/kakkun61/liquoh/blob/0eea3ea99e480f11e419febeac476fc3caa32d07/src/Text/Liquoh/Interpreter/Expression.hs
@kakkun61 多分, code-review の方がいいと思うので,そっち行きますね
HPCでテストのカバレッジを取る時、deriving で導出した部分は(特にderiving (Eq, Show, Ord, Typeable) あたり)は除外したいって思ってしまうのですが、みなさんどうしてるんだろ
@tokiude0sai has joined the channel
@kmiya has joined the channel
なにがありましたっけ?「Haskell風の別の言語」というとPureScriptやElmが思い浮かびますが、それ以外があまり出てこない… Ivoryとか? https://twitter.com/qnighy/status/967959302118895616?s=09
Agda とか Idris とか?
Fay, Haste, Royなどがありますが皆まだ生きてるのかは知らない…
定義によるが Haste は Haskell 風言語ではなく Haskell そのものと言えそう。
haskell実装だとlunaとかも
JVM で動く Eta とか
ML系とHaskell違くない?
JVM系で言うと、Eta は GHC を使ってるので Haskell そのものと十分言える。Frege は Haskell 2010 を参考にしている部分が多いが GHC を使っておらず Haskell 完全準拠ではないはずなので Haskell 系の別言語と言えそう。(このあたり @y_taka_23 さんが詳しいはず…)
ああ、すみません、熱に浮かされていたせいかいろいろど忘れしてました…:sweat_smile:
@syocy Frege と Eta は Haskell と言ってしまってよいでしょう。両者とも Haskell 2010 準拠を謳って(少なくとも目指しては)います。Eta はさらに GHC7 相当の拡張を載せることで既存の Hackage ライブラリを再利用可能にしている、という点が Frege に対するアドバンテージです。C-FFI を使っているライブラリはそのままでは動かせないので、パッチを当てるための仕組みがあります。

コードベースに関して言うなら、Frege は GHC とは別系統です(そもそも当初は JVM 言語ですらなく v1 は Perl 実装だった)。Eta は GHC のフォークで、STG 生成までは GHC と同じコードを使います。ちなみにビルドツール Etlas も Cabal のフォークです。
なんか早口のオタクみたいになってしまった。
slackarchive.io の収集がなんか止まってるように見えますね
https://haskell-jp.slackarchive.io
gtk2hsではなくてgi-gtkを使ったことがある人はいますか?gtk2hsはAPIに抜けがあったり公式に新しいアプリでは非推奨と書いてあるんですが、既存のアプリをポートする価値があるかなと検討してます。
@ryota-ka has joined the channel
一度だけgtk2hsからgi-gtkに書き直したことがあります。
cairo周りの変更への追従もあり、色々と修正が必要でしたが、使えない機能(ウィジェット)がないのはよいと思いました。
特にハマったところもない感じでしょうか。依存関係にxml-conduitが入っていて、conduit周りの依存を引っ張ってきてしまうのも気になるところです。
そうですねえ、まずサンプルプログラムで違いを理解してから移植に取り組んだのですが、それほど大きな違いはなかったと思います。依存パッケージは増えますが、新しいHeaderBarなどを使いたかったのでgtk-giにしました。しかしgtk2hsも開発続いていたんですね(今知りました)。
私も最近 gi-gtk に移行したのですが、ListStore まわりの移植でちょっとハマったくらいですかね (gi-gtk-hs を知らなかった)
gi-gtkにListStoreがあってgi-gtk-hsにはSeqStoreというgtk2hsのListStoreのコピーがあるんですね。どう違うのでしょうか。
インスタンスのメソッドが未定義でも警告で済まされてしまうせいで二度も足止めを食らってしまった… :hole: https://hackage.haskell.org/package/exceptions-0.9.0/docs/Control-Monad-Catch.html#v:generalBracket
gi-gtk の ListStore は gobject-introspection そのままなので、格納する値は GValue にする必要がありますが、
一方、gi-gtk-hs の SeqStore だと Haskell の任意の型を入れられるという感じですかね?
なるほど、ListStoreの方は使いにくそうですね
気が向いたらでいいのでTwitterで突っついといて頂けると助かります:pray:
今できることはそれぐらいしかないので…
取り急ぎ私からも再度お願いしました
https://twitter.com/igrep/status/969016207432040449?s=19