haskell-jp / questions #23

“A monad is a monoid in the category of endofunctors.” Is there something similar for comonad? Hmm, say, comonoid? What does it looks like if there is?
I tried to flip the arrow of monoid, but it looks strange…

class Comonoid a where
  coidentity :: a -> ()
  comultiple :: a -> (a, a)


And I cannot find any law of it…

maybe … ?

class Comonoid a where
    v :: a -> ()
    p :: a -> a
    q :: a -> a

forall x.

((p.p) x, (q.p) x , q x) = (p x, (p.q) x, (q.q) x)

p x = x
q x = x


But it’s nearly of no use…
That’s comonoid laws on Haskell (if you think about only in Set)

Haskell has the instance of all types for Comonoid:
instance Comonoid a where
  coidentity _ = ()
  comultiple x = (x, x)


This instance is trivial and the only.

See also: https://stackoverflow.com/questions/23855070/what-does-a-nontrivial-comonoid-look-like
面白そう、と思って似たようなパターンを試してるんですが、難しいですね。
こういうのも実装できない感じでしょうか

import Data.Type.Equality

unProd :: a1 :~: a2 -> b1 :~: b2 -> '(a1, b1) :~: '(a2, b2)
unProd r1 r2 = undefined -- Refl
失礼、上のはこうしたら通りました。

unProd :: a1 :~: a2 -> b1 :~: b2 -> '(a1, b1) :~: '(a2, b2)
unProd Refl Refl = Refl
hmmm, so comonoid = droppable ^ clonable?
it make sense if the value can be passed only once
あてずっぽうで色々試したら近くまでは行けたんですけど…… https://wandbox.org/permlink/X10EaUGaJ385JWlj
型クラス要らなかった

extractedTuple' :: forall a b t. (t ~ '(a, b)) => '(Fst t, Snd t) :~: t
extractedTuple' = apply (apply Refl (Refl :: Fst t :~: a)) (Refl :: Snd t :~: b)
streams 、いいですね!これは使える!
ありがとうございます!
僕も気になっていろいろ試してみました。
constraintが増えていますが、以下の様な感じでできました:

{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}

module Foo where

import Data.Singletons.Prelude (Fst, Snd)
import Data.Type.Equality ((:~:)(Refl))

extractedTuple :: forall a fst snd. (fst ~ Fst a, snd ~ Snd a, a ~ '(fst, snd)) => '(Fst a, Snd a) :~: a
extractedTuple = Refl

useExtractedTuple :: ()
useExtractedTuple =
  case extractedTuple @'(Int, Bool) of
    Refl -> ()
お二方ともありがとうございます.どちらも t ~ '(a, b) と仮定して Fst t / Snd t'(a, b) でパターンマッチできることを教えればできるという感じですかね?やっぱり,そういう感じの制約をつけないと厳しいですかね…
関数の `where` 内で、外側の型パラメータを参照することはできないのでしょうか?

```
hoge :: a -> [a] -> [a]
hoge x = go
where
go :: [b] -> [b]
go xs = x : xs
```

例えばこういうコード↑で b ~ a としたいです。
あぁーっ!まさにそのための拡張があるんですが名前が出てこない!!
ScopedTypeVariablesで出来ると思います
それでできると思ったのですけど・・・
ありがちなミスは forall を該当の型変数に書き忘れる、とかですかね。(経験者談)
あ、それでした!
OK

hoge :: forall a. a -> [a] -> [a]
hoge x = go
  where
    go :: [a] -> [a]
    go xs = x : xs
ありがとうございました!
readFile を使ってファイルを読み込もうとしています。ただ、 "~/.bashrc" のような形式のパスは解釈してくれないようです。こういったパスをまとめて扱ってくれるようなライブラリはありますか?
また、こういったライブラリを調べる際には、皆さんどういったところから探してきておられるのですかね?
結構はやりすたりというか、どういうやり方でやるのが良いかという論争があったりするように聞いているので、出来るだけ現在の様子を知ってから選びたいと思っているのですが。
うーん、探すことだけに絞ると、hackageやGoogleで検索する、以上のことは私はしてないですね。
後は一つ一つドキュメントがちゃんと書かれているかチェックしたり、実際に軽く使ってみて判断する、ぐらいでしょうか。
英語ですが、そういう、パッケージの選び方について解説した記事が http://www.haskellforall.com/2018/05/how-i-evaluate-haskell-packages.html です。
~ をホームディレクトリに展開してくれるものは分からないですが、ホームディレクトリが参照できればいいのであれば path と path-io パッケージを使って以下のように書けるはずです。
h <- getHomeDir
readFile $ toFilePath $ h </> $(mkRelFile ".bashrc")
そのGabrielさんの、State of the Haskell ecosystem というのもありますね。
https://github.com/Gabriel439/post-rfc/blob/master/sotu.md
最近はinteroで生成せずに移動できるようになったのでタグ生成自体やらなくなりましたね
interoは何で使ってます?Emacs?
はい,Emacsで使ってます
最近は色々なエディタに対応し始めたみたいですね
Data.Vector.Storable.Mutable.unsafeFromForeignPtr の説明で、
http://hackage.haskell.org/package/vector-0.12.0.1/docs/Data-Vector-Storable-Mutable.html#v:unsafeFromForeignPtr
Modifying data through the ForeignPtr afterwards is unsafe if the vector could have been frozen before the modification.
とあるけれど、 freeze なら複製されるはずだし、 unsafeFreeze ならそれを呼ぶ側の責任だしで、これがどれくらい危険なのかよく分からず……
どういう場合にどれくらい危険なのか、どなたかご存じないでしょうか?
純粋なのに例外を投げる関数に対する例外処理ついて質問です。
例えばこのような例外を投げる純粋関数があるとし、そしてその例外を投げてくる原因が不明だったとします。

-- evilFunを使用する人には"hiroto"がエラーを吐くことがわからない。
evilFun :: Text -> Text
evilFun "hiroto" = error "This is evil function"
evilFun _ = "Everything is alright!"


この関数を使用した際の例外処理はどのようにすればよいのでしょうか。(Either, Maybe, MonadCatch..?)
結局のところ読まないとエラーが起こるかどうかはわからないという問題は残りますが、こちらをどうぞ https://qiita.com/techno-tanoC/items/1b725713cd01bdf83b40
不可能。
ExceptionはIOのみ処理できる、
evaluate :: a -> IO a
ありがとう!なんで全然できないんだろーって思ったらやっぱりややこしいんですね。。この関数を作った人を恨みます。
import Data.Vector.Storable.Mutable
import Data.Vector.Storable (freeze)
import 
import Foreign.ForeignPtr
import Foreign.Storable
import Data.Foldable

main :: IO ()
main = do
  fp <- mallocForeignPtrArray 10
  withForeignPtr fp $ \p -> flip traverse_ [0..10] $ \i -> do
    pokeElemOff p i i
  let nv = runST $ freeze (unsafeFromForeignPtr0 fp 10)
  withForeignPtr fp $ \p -> do
    poke p 42
    pure ()
  print nv
  pure ()
コピーされたとしても、改竄されたあとならあまり変わらないね
おお、なるほどー
unsafeFromForeignPtr の結果は IOVector に限定されないから、 STVector として使うとこんなことができちゃうんですね。
特に汎用性を持つ必要がないなら
Text -> Maybe Text
汎用性を持たせたいなら
MonadError e m => Text -> m Text
あたりが僕は好きです!

https://aiya000.github.io/posts/2018-06-30-use-mtl-exceptt-no-eithert.html
(宣伝)
なるほど、そもそもその邪悪関数を改変できないことが前提なのかな…
改変できないんです。。!
Zipファイルを解凍するライブラリ
を使用してるんですが、どうやらzlibの`decompress`っていう関数を使用しているみたいで、こいつが部分関数ではないかと推測してます
http://hackage.haskell.org/package/zlib-0.6.2/docs/Codec-Compression-Zlib.html
内容次第ではPull requestいきですね... :disappointed: :muscle:
効率のためにわざとPartial Functionを使うのも少なくないね
@km has joined the channel
昨日はありがとうございました。
色々考えたけど、部分関数の例外処理に`evaluate`は理にかなってると思いますね。部分関数を純粋な関数として扱おうとする方が危険な気がします。(もちろんMaybeやEitherで例外処理できれば理想ですが。。)
末尾再帰していなくてもHaskellでスタックオーバーフローってめったに見ないんですけどどうしてなんでしょうか?スタックがデフォルトで深めに設定されている?
遅延評価での関数呼び出しは、jump であり、スタックを消費しません。
スタックが消費されるのは、正格評価で戻り値がその場で必要となるところだけです。Haskell では、それは case ... of のところです。
話はそれますが、Monad のインスタンスの多くが順番を守るのは、>>= の中で case ... of が使われているからです。
全然知りませんでした、すごい興味があるのでどうやってHaskellが遅延評価を実現しているか等の資料をもしご存知ならいただけないでしょうか?
これかなぁ?