haskell-jp / questions #11

accept :: Socket -> IO (Socket, SockAddr)

SockAddr をユーザが拡張できるように
accept :: SocketAddress sa => Socket -> IO (Socket, sa)

としたかったんですが、型が決まらないので、
accept :: Socket -> IO (Socket, SockAddr)
accept' :: SocketAddress sa => Socket -> IO (Socket, sa)

としてるんですが、かっこ悪いですねぇ。
使ったことないのでわからないんですがExtendedDefaultRulesでこういうことが出来たりしないですかね?
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html?highlight=extendeddefaultrules#ghc-flag--XExtendedDefaultRules
ExtendedDefaultRules は,ここにあるクラスしか,適用できない感がありますね
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#interactive-classes

TypeApplication を使って, accept @SockAddr とする前提でAPIを設計する(いちよシグネチャを明示的に書けば, TypeApplication を使わなくても良い)感じはダメなんですかね?
あと OverloadedString 拡張を有効にした時は IsString にも指定できるんだそうです。 https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#overloaded-string-literals
@rystylee8 has joined the channel
@masakolee has joined the channel
being.paperlefthand
@being.paperlefthand has joined the channel
どうもうまい方法はなさそうなので、Network.Socket は SockAddr 固定とし、generic な API は別モジュールで提供することにします。
みなさん、いろいろありがとうございました。勉強になりました。
@h_hosokawa has joined the channel
@ice08235523 has joined the channel
@yokomotod has joined the channel
Generic2 クラスがない理由ってなんか技術的な理由だったりするんでしょうか?
@tukejonny has joined the channel
@shnarazk has joined the channel
Queue のライブラリってありますか?
「Haskell queue」でググると出てくる↓は Stackage には無いから枯れちゃってるのかなぁと思いますし、何がデファクトなんでしょうか?
https://hackage.haskell.org/package/queue
「Deprecated」って書いてありますもんね。 :disappointed:
ほしいのは並行計算で使う方じゃないキューですよね?
であれば、
https://wiki.haskell.jp/データ構造列伝 でも触れているSeqか、確か銀行家キューを実装したパッケージもあったよな。。。 :thinking_face:
ふつーの FIFO なデータ構造ですね
deque とか優先度つきのキューなら何種類かあるんですけど、それはそれでどれを使えばいいのやら。
こんぐらいは自前で実装するのが当たり前なんですかね :thinking_face:
なるほど
あでも、これも stackage にはない....
まぁstackageに置いているかどうかは作った人の裁量しだいなんで、的確な基準ではないんじゃないかな、と思います。
まぁそうですね
$ stack new blog hakyll-template
$ cd blog
# stack.yaml の resolver を nightly-2018-01-29 に
$ stack build

すると ↓ のようなエラーが出るのですが解決方法が分かりません。
Objective-C のコードを gcc が理解できてないんだろうなぐらいは分かるのですが。
• OS X El Capitan 10.11.6
• stack 1.6.3
@kakkun61 uploaded a file: building hakyll on OS X
恐らく別件ですが類似の問題:
https://github.com/luite/hfsevents/issues/9
報告した方がいいかもですね。。。

ちなみに、念のため言うと、GCCはObjective-Cもちゃんとサポートしています。
あ、まさに hfsevents のビルドでこけてるのでこれっぽい
コミュニティに与えた損害の埋め合わせのために、明日は仕事を休み、Haskell-jpに貢献できるようなことに費やします。Trelloにあったコーディング規約について、Wikiに投稿しようと考えています。他にも、何か案があればご教示を願いたいです
そのイシューに Apple's Clang/LLVM 使えとあって Free Software Foundation GCC へのパスを消したら通りました
stack の --with-gcc をオプションや stack.yaml ファイルに書いたりして GCC/Clang と FSF GCC と試したんだけどなぁ
GCC/Clang と書いているのはバックエンドが Clang だけど GCC 互換インターフェースをそなえている Apple の GCC です
これはダメなんでしょうか?使ったことないんですけど
https://hackage.haskell.org/package/heaps-0.3.6
Oh… FIFOなのが欲しいんですね.
double-endedなのは, https://hackage.haskell.org/package/deque-0.2/docs/Deque.html もあるっぽいですが,どっちもあんまメンテされてなさそうですね… :sweat_smile:
@satopen1729 has joined the channel
kazu さんが昔記事にかいてるみたいに、需要がそもそも無いんですかね :sweat_smile:
http://d.hatena.ne.jp/kazu-yamamoto/touch/20121107/1352259739

効率が要るという訳でもないですし、おとなしく containers の Seq を使っておきます…
ありがとうございました。
今更なんですけど、実はほしかったのはdlistだったりしない?
https://hackage.haskell.org/package/dlist-0.8.0.4/docs/Data-DList.html
後ろに追加していって最後にまとめて先頭から処理する、みたいな用途だと十分いけるのかな、と思うのですがいかがでしょう?
Applicativeも含めた型の俯瞰図の、歴史のスナップショットの2点はこういうのもありますね。

Typeclasspedia の昔の版(ApplicativeとMonadが切れてるころ)の日本語訳
http://snak.tdiary.net/20091020.html

Typeclasspedia のAMPとFTPの各プロポーザル反映後の最新版
https://byorgey.wordpress.com/2017/06/07/the-typeclassopedia-is-now-up-to-date/
https://wiki.haskell.org/Typeclassopedia
DList は良く分からないですけど、ぼくが欲しかったのは、本当に一般的な FIFO キューですので違うかなぁ。
教えてください。

class Foo a where
    toFoo  :: Int -> a
    fromFoo :: a -> Int


という型クラスがあったとして、

intToInt :: Int -> Int
intToInt = fromFoo . toFoo


というコードを書きたいとき、中間の Foo a => a が一致することを要求するよう要求し、型検査を通す方法ってありますか?
どの Foo のインスタンスを使うかで intToInt の実装は変わってしまうので、 a からは逃げられない気がしますよね・・・。
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE AllowAmbiguousTypes #-}

class Foo a where
    toFoo  :: Int -> a
    fromFoo :: a -> Int

intToInt :: forall a. Foo a => Int -> Int
intToInt = fromFoo . toFoo @a
具体的な Foo のインスタンスを宣言してそれを使うようにするというのはどうですか?

{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE GADTs #-}

class Foo a where
  toFoo :: Int -> a
  fromFoo :: a -> Int

instance Foo Integer where
  toFoo = toInteger
  fromFoo = fromInteger

intToInt :: forall a. (Foo a, a ~ Integer) => Int -> Int
intToInt = fromFoo . toFoo @a
ありがとうございます。
TypeApplications でできることは確かめました。
しかし、networkライブラリのメインテナとしては、GHC 7も救わないといけません。。。
forall単独で変数を導入できるのは8.2からなので、Proxyを引数に加えてScopedTypeVariableを利用する必要があると思います。
ExplicitForAll を書かなくても、GHC 8.0 では forall が使えちゃうなぁ。
ScopedTypeVariablesを有効にすると ExplicitForAll が有効になります。これはたぶん、7.10 でも同じだった気がします
明後日Philip Wadler氏の授業を受けるのですが、何か質問とか聞いてみたいことはありますか?(どんどん質問してこいと言われてます)
ちなみに今日の講義内容はProposition as Types, Session type、Process calculusに関するものでした。