haskell-jp / questions #91

あるいは、
instance MonadFail m => AWST' env m where
  fail = ...

というインスタンスなら汎用性があるのでそれをPRしてあげるか。
amazonka的にはMonadCatch系を使いたいようなので本流には入らなさそうな気がしますね
なるほど streaming の方はサードパーティーか... じゃあおかしいのは
amazonka-s3-streaming のほうですね... ざっとソース読んだ感じ別に fail が絶対に必要な展開ではないんだよなぁ... https://hackage.haskell.org/package/amazonka-s3-streaming-1.1.0.0/docs/src/Network.AWS.S3.StreamingUpload.html#concurrentUpload
作者も修正したさそうなので修正投げようかと思ったのですが型が大きく変動しそうなのでちょっと気後れしちゃいますね
MonadFailMonadThrow に変えるか、 SomeExceptionfail で投げるはずの例外を包んであげればいいかな、と思いましたが、そもそも、すでに mMonadUnliftIO mMonadIO のサブクラス)が実装済みなワケですから liftIO fail にすればそこで賄えるかと(多分作者の気持ちはそっちの方が近いし)

それに、仮に変わるとしてもそういうときのためのHPVPなんですから、何も恐れる必要はないと思いますよ!はっきりいって使い物にならないような設計にしてしまっているので恐れず変えちゃいましょう。
なるほどfailをliftIOする方法がありましたか
考えてみます
ちなみに、 MonadThrow に変える方法に抵抗がある理由が「例外作らなきゃいけない」でしたら throwString の使用をご検討ください。
https://www.stackage.org/haddock/lts-16.17/unliftio-0.2.13/UnliftIO-Exception.html#v:throwString
unliftioに入っているので新たに依存関係を足す必要もありません。
続けて済みません「作者が痛みとして思っている」という情報はどこらですか? https://github.com/axman6/amazonka-s3-streaming/issues をざっと見ましたがそれらしいものはないみたいで。どういう論点で MonadFail のままにしているのか気になります。
パフォーマンス改善のpull requestsへのコメントで
作者「MonadFail辛いしやめたい」
PR作成者「それこのPRで扱うことではないのでは」
みたいなやり取りがありました
MonadFailじゃなくてMonadAWSの話みたいですよ!
https://github.com/axman6/amazonka-s3-streaming/pull/20
@ has joined the channel
@ has joined the channel
リストをなんらかの区切りでリストのリストに分けたいとします。
ただし、区切りは捨てたいです。
どのように実現するのが簡単でしょうか?
たとえば、-1 が区切りだとして、groupBy を使うと、-1 が残ってしまいますね。

> groupBy (\_ x -> x /= -1) [1,2,-1,3,4,-1,5,6]
[[1,2],[-1,3,4],[-1,5,6]]

実際には Conduit を使ってやります。
splitパッケージを見るといいと思います。
つまり自作しろと。。。うう。
すでに試しているのですが、それではない気がします。
Element ByteString = Word8 なので、空行 (`"\n\n"`)とか指定できないですね。。。
group :: Monad m => (a -> Bool) -> ConduitT a [a] m ()
group f = loop id
  where
    loop rest = do
        mx <- await
        case mx of
          Nothing -> case rest [] of
            [] -> return ()
            l  -> yield l
          Just x
            | f x       -> yield (rest []) >> loop id
            | otherwise -> loop (rest . (x:))

結局自作しましたが、何が正しいのか Michael に聞いてみます。
Michael から返事が来て「君の実装が一番いい」と言われました。^^; Haskell ライブラリには、なぜか splitOn が提供されない問題ですね!
@Jens Petersen has joined the channel
[日本語をshowしてうまく表示されなかったら - Haskell-jp]()
のように開発時のREPLのためにpretty-simpleパッケージを使おうと思っています
しかし実際のパッケージではREPLのためのpretty-simpleには依存していません
npmのdevDependenciesのように開発向けパッケージを定義したいのですがそのような方法はありますか?
うーん、開発者向けのドキュメントに「 stack build pretty-simiple (あるいは cabal install --lib pretty-simple )してくれ」と書くか、
cabalファイルのフラグ機能を使ってデフォルトオフなフラグを作っておいて、 stack.yamlcabal.project には有効にするよう記載する、ってところですかね。
なるほど、フラグ機能を使う手がありましたか
今回のケース https://github.com/ncaq/dic-nico-intersection-pixiv ではどうせ開発者は私しか居ないしアプリケーションなのでそこまで気にする必要は無いのですが、広範囲に使っていこうとした時にどうしようかなと悩んでいました
ありがとうございます
型クラスの旨味がなくなるというのはインスタンスによってメソッドの呼び出し方とか呼び出せるかどうかとかが変わっちゃうからですか?
だとするともしかして、メソッドの制約の部分が関連型族になるのも旨味がなくなってたりしますか?
なんかもうどう設計するのがよかったのかわからなくなっちゃいました༼;´༎ຶ ༎ຶ༽
その通りです。インスタンスが違っても共通のコードから呼び出せるという利点をなくしてしまうと、別々の関数として定義するのと同じになってしまうので… 型族によって制約を変えること自体は、その性質を崩さないので大丈夫です
どうして制約の部分が変わるのは大丈夫なんですか?:owl:
() => a -> Hoge って関数がいきなり Num a => a -> Hoge とかに変わったら同じコードから呼び出せなくなりませんか?
RIOがIOに変わったらほぼ100%呼び出すことはできなくなりますが、もし扱っている型がすべてNumであるという前提条件があるなら、同じコードを使いまわすことができます。もしそうでないなら、型クラスを使わずに別々に定義すべきなのでしょう
@ has joined the channel
Viktor Kronvall
@Viktor Kronvall has joined the channel
@Jonas has joined the channel
なるほど〜どうもありがとうございます:owl:
自分でもじっくり色々考えてみたけどRIOを使うところは固定しちゃうのが良さそうというのがわかってきました
その方針で実装しようとしたらもう一つ問題が出てきちゃいました:sob:
data AnyBot = forall b. Bot b => AnyBot b

instance Bot AnyBot where
  type Dep AnyBot a = ()
  name (AnyBot b) = name b
  reply (AnyBot b) msg = reply b msg

このような存在型を追加したら
Could not deduce: Dep b env arising from a use of 'reply'

というエラーが出てしまってどうしたらいいのかわからなくなっちゃいました
どうかお助けください:sob::sorena::oden::exploding_head:
AnyBotの中身が何かに依存しているにも関わらず、`type Dep AnyBot a = ()` とすることはできないのでそのままでは定義できません。AnyBotに型パラメータを追加して、`type Dep (AnyBot env) a = (a ~ env)` としてみては?
@sh1ma has joined the channel
@ has joined the channel
GitHub Pages で動作させたいプログラムです。 jsaddle は GHCJS がない時はサーバーで動くようなので、適用できなさそうです。
@ has joined the channel
takino takayuki
@takino takayuki has joined the channel
初歩的な質問です。

0からIntegerの n までの総和を求める関数を作りたいです。
f n = sum [0..n] と書けばしまいですが、こうすると nが大きく(9桁とか)なったときにかなり時間がかかってしまいます。(回避策はあるのでしょうか)

そこで、`f n = n*(n+1)/2` として求めたいのですが、こうすると、返り値の型をFractionalなものにしないといけなくなってしまいます。こういう場合はどう書くのが良いのでしょうか?`f :: Integer -> Integer`としたいです。

Integerを代入した場合、返り値がIntegerで表現できることは明確保証されているはずですが、`fromDouble` 的な関数を使って型変換をする必要があるのでしょうか?

どなたかご存じの方がいらっしゃったらお願いします。
div 関数があるので、余りが出ないことを確信しているなら使えます
[Prelude]()
あーーー、なるほどです!!解決しました。ありがとうございます。
@ has joined the channel
@ has joined the channel
なるほど…ありがとございます:innocent:
なんかこの辺の型考えるの、まだすぐ頭ごちゃごちゃになっちゃいます。
イメージするコツとかあります?
@nakana has joined the channel
@takuma okada has joined the channel