haskell-jp / questions #73

@Yachi Wataru has joined the channel
@ has joined the channel
ぼくもまったく同じことをしているので気持ちが分かる気がします。実際のソースを追うと勉強しなきゃいけないことが増える、の繰り返しがあって、もともと知りたかったことに素直にたどり着けない。
@matoruru has joined the channel
友達はこの記事を読んでStateモナドが理解できたって言ってました。参考程度にはなるかも?
http://brandon.si/code/the-state-monad-a-tutorial-for-the-confused/
一回Stateモナド無しで状態を扱ってみて、Stateが何をやってくれてるかを感じるのも良いかも
昔は cabal-rangefinder というツールで出来たんですが、メンテ止まってて新しいcabalだと動かなそうです
@hiroshi has joined the channel
勉強のためにいくつかの基本的な部品を自分でも書いてみているところです。ExceptT の <*> の定義なんですが、Control.Monad.Trans.Except のソース( )だと
こうなんですが、単に以下でもよさそうに思うんですがどうでしょう。
それだと「fがLeftを返した場合にvが実行されない」という挙動を実現できないのではないでしょうか
Data.Either ( )のソースによると
Either の <*> はこうなってるようなので、mf が Left e ならそのまま Left e が返るように見えます。
vに副作用がなければそれでいいんですが、現実にはvが副作用を持っているかもしれないので、 mv <- v が実行される前にLeft eを返す必要があります
なるほど!
だからわざわざこう書いてあるわけなんですね…。すごい。ありがとうございます!
@ has joined the channel
@momohatt has joined the channel
かなり初歩的な質問で恐縮なのですが、「データ型」という言葉は「型」という言葉と全く同じ意味だと考えても大丈夫でしょうか? Haskellの入門書とかだとデータ型という言葉がいきなり登場するので気になってしまって。
はい。問題ないと思います。
@Yutaro has joined the channel
ありがとうございます!
@temp_la has joined the channel
ちょっと疑問なのですが,data typeってもちろん「型」の意味でも使われていると思うのですが, data type,すなわち代数的データ型の意味で使われていることないです? https://gitlab.haskell.org/ghc/ghc/wikis/unlifted-data-types とかその例だと思うんですよね.
@tobita has joined the channel
最近のcabalで、stackのglobal project相当のこと、つまり、cabal.projectなどがないディレクトリーでcabal v2-installを実行することはできますか?
ちょっとパッケージを試すのに逐一プロジェクトを作るのも不便だな、と思いまして。
3.0では実行ファイルはcabal installで、ライブラリはcabal install --libでglobal project相当の場所にインストール出来ます。
ちなみにreplだけならcabal repl -b package1 -b package2みたいに依存関係をその場で指定してreplをスタートできます
できました!ありがとうございます!
捕捉: cabal 2.4でも v2-install --lib packagev2-repl -b package でできました。
@ has joined the channel
Apache-2.0 を使っているライブラリって見たことがありますか? 使おうと思っているんですが
ライセンスの話ですよね。
:raised_hand: 私が個人で作るときは基本Apache-2.0にしてます。
@philomagi has joined the channel
@Tota Nakajo has joined the channel
いわゆるRecord of Functionsを好んでよく作るのですが、例えば以下のように print 関数をセットできるRecord型を作ろうとすると、Impredicative Typeを作ってしまい、コンパイルが通せません。
data Env m = Env
  { print :: forall a. Show a => a -> m ()
  , otherFields :: m Int
  }

Record of Functionsを諦めてreflectionsパッケージを使うとか、妥協して printString -> m () に変えるとか、いろいろ回避策は考えられると思うのですが、どんな方法がいいと思いますか?
その宣言だけなら普通に通るっぽいです

Prelude> :set -XRankNTypes
Prelude> data Env m = Env { print :: forall a. Show a => a -> m (), otherFields :: m Int }
Prelude> :type Env
Env :: (forall a. Show a => a -> m ()) -> m Int -> Env m
Prelude> x = Env Prelude.print (return 0)
Prelude> :info x
x :: Env IO     -- Defined at <interactive>:10:1
あれ、どこで間違えたんだろう... すみません... :sweat_drops:
ぽんちゃん
2重リストにmapを適用させる関数を書きたいのですが、

[[2],[2]Listed: Listed.hs:(10,1)-(11,55): Non-exhaustive patterns in function secmap

このようなエラーが出てしまいます。どなたかアドバイスいただけないでしょうか?
また、haskellでは多重リストに対してはあまり関数を作らないのでしょうか?ネットにあまりそう言った記事がなかったので多重リストに対し処理を行うのであれば他のアプローチがあるのであれば教えていただけると幸いです。
よろしくお願いします。

module Listed(main) where

main :: IO ()
main = do
       print $ secmap (+1) [[1],[1]]
       print 1


secmap :: (a-> b) -> [[a]] -> [[b]]
secmap f [[]]           = [[]]
secmap f ((x : xs):xxs) = ((f x:map f xs):secmap f xxs)
[[][]]にマッチしないからですかね?
ちなみに、エラーの意味はわかってますか?
意図は`secmap = map . map`なのでしょうか.
ぽんちゃん
おそらく再帰の最後(今回だと二つ目の[1]の後)にsecmapに渡されるとき[]になってしまって違う型になっているのだと思いますが、関数の定義の際それをどうやって指定すればいいのかわかりません...

意図としてはそうですがMap関数はリストのリストに対しても適当可能なのでしょうか?
(type エラーもあるかもしれませんが)
これはパターンマッチングにおいてパターンが網羅的になってないって意味のエラーなはず
多重リストを扱うとき,自分もこんがらがるのでリスト内包表記を併用したりしてます.(例えば下記のような感じで…)
[ map (+1) xs | xs <- [[1], [1]] ]

もちろん,リスト内包表記の内部でリスト内包表記を扱うことも出来ます.
[ [ x + 1 | x <- xs] | xs <- [[1], [1]] ] 
今作ってるライブラリも個人なので Apache-2.0 にしました https://github.com/Hexirp/yhseq
ありがとうございます
ぽんちゃん
リスト内包はこう言う時に使うんですね、、、
ありがとうございます!