haskell-jp / beginners #21

→ コードテストでは失敗、提出すると AC でした。
(たぶん) アルゴ式側の問題のようなので (運営の方に) 質問してみます m(_ _)m
... Replies ...
入力が空欄でした…… ありがとうございます!
@fet has joined the channel
現在haskell で gmail の新着を imap で取得し、tmux のステータスバーに表示するプログラムを常用しております。oauth2.0 認証に変更したいのですが、参考にすべきサンプルコード等を探しています。参考情報等ご教示いただけると助かります。
... Replies ...
@shinya sakae has joined the channel
@ has joined the channel
@ has joined the channel
コマンドラインで関数定義を引くことはできますか?
たとえば print で検索したら print = putStrLn . show みたいなものが一発で出てくると嬉しいです。
hoogle で検索すれば型は出て来ますが、定義は出せないのでしょうか
... Replies ...
@hirofumikubo has joined the channel
@Nakamin7 has joined the channel
@osada has joined the channel
@ has joined the channel
@ has joined the channel
yesod のクイックスタートガイド()に従って
コマンド`stack install yesod-bin --install-ghc` を実行すると下記エラーになってしまいます。
ghc: panic! (the 'impossible' happened)
  (GHC version 8.8.4 for x86_64-unknown-linux):
        Prelude.chr: bad argument: 1526726659

Please report this as a GHC bug:  


--  While building simple Setup.hs (scroll up to its section to see the error) using:
      /home/morizumi/.stack/programs/x86_64-linux/ghc-tinfo6-8.8.4/bin/ghc-8.8.4 -rtsopts -threaded -clear-package-db -global-package-db -hide-all-packages -package base -main-is StackSetupShim.mainOverride -package Cabal-3.0.1.0 /home/morizumi/.stack/setup-exe-src/setup-mPHDZzAJ.hs /home/morizumi/.stack/setup-exe-src/setup-shim-mPHDZzAJ.hs -o /home/morizumi/.stack/setup-exe-cache/x86_64-linux-tinfo6/tmp-Cabal-simple_mPHDZzAJ_3.0.1.0_ghc-8.8.4
    Process exited with code: ExitFailure 1

このエラーを無視して`stack build` しても同じエラーになります。
エラーの修正方法などありましたら、教えていただけると助かります。
... Replies ...
こんにちは。
詰まったところがあるので質問させてください。
戻り値の型が IO Boolの solve i j 関数があり、内包表記の中で以下のコードのように使おうと思っております。[Bool]のリストを得たいと思ったのですが、solve i j の戻り値の型が IO Boolであることから、IOが邪魔で困っています([IO Bool]になってしまうので)。どうにかならないでしょうか。unsafePerfomIOは使いたくないと思っています。
print[solve i j | i <- [0 .. n-2], j <- [i+1 .. n-1]]
... Replies ...
あびしゃい後円墳
@あびしゃい後円墳 has joined the channel
liftM2とliftA2という関数について質問です。
liftM2とliftA2の定義は以下のようになっており
liftA2 :: (a -> b -> c) -> f a -> f b -> f c
liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r

Applicativeに包まれているかMonadに包まれているかが違いとなる印象を受けますが、liftA2で動くがliftM2では動かない、またはliftM2では動くがliftA2では動かない簡単な具体例はありますでしょうか?(ApplicativeではあるがMonadではない例とも言える?)
ふと気になり質問させていただきました。ご回答お待ちしております。
... Replies ...
Hiromasa Sakata
@Hiromasa Sakata has joined the channel
こんばんは。 AtCoder で固定長配列を使いたいですが、何かお勧めがあれば教えてください。 (ただ当面リストを使うつもりです)
- Array: ヒープに配置される気がします
- Data.Vector.Fixed: LTS 16.11 の vector にはありませんでした
- タプル: 使えそうですが、使い勝手は悪そうです
- repa: いつか確認したいです
... Replies ...
こんばんは。 AtCoder で固定長配列を使いたいですが、何かお勧めがあれば教えてください。 (ただ当面リストを使うつもりです)
- Array: ヒープに配置される気がします
- Data.Vector.Fixed: LTS 16.11 の vector にはありませんでした
- タプル: 使えそうですが、使い勝手は悪そうです
- repa: いつか確認したいです
... Replies ...
@Smearble has joined the channel
@尾﨑嘉彦 has joined the channel
@有田翔梧 has joined the channel
GHCオプションの警告や例外処理について教えてください。
GHCのバージョンは8.10.7です。

下記コードのpt1を実行すると「user error (Pattern match failure in do expression」というような例外が、pt2を実行すると「Non-exhaustive patterns in lambda」というような例外が起きてプログラムが落ちてしまうのですが、どのようにすべきなのでしょうか?

-WallオプションはOnにしてみたのですが、コンパイル時にエラーになってくれません。
-Wall以外に何か指定すべきでしょうか?

catchを使うと落ちることはなくなりました。
main関数のすぐ下にcatchを書いてすべて包むべきものなのでしょうか?

よろしくお願いします。

func1 :: IO (Maybe Int, Maybe Int)
func1 = do
  return (Nothing, Nothing)

-- user error (Pattern match failure in do expression
pt1 :: IO ()
pt1 = do
  (_, Just var2) <- func1
  print var2
  return ()

-- Non-exhaustive patterns in lambda
pt2 :: IO ()
pt2 = do
  bracket
    func1
    (\_ -> print ("cleanup" :: String))
    ( \(_, Just var2) ->
        print var2
    )
パターン照合は、すべての場合を網羅するよう(exhaustive)に書くことをお勧めします。〈パターン〉<- 〈式〉のような構文ではパターン並記ができないので、多段に構える必要があります。たとえば、
pt1 :: IO ()
pt1 = do
  (_, q) <- func1
  case q of
    Nothing -> error "no data"
    Just v  -> print v

1つめのパターン (_, q)(Maybe Int, Maybe Int) 型の値すべてを網羅していることに注目してください。`case` 式では2つパターンを書いて Maybe Int 型の値のすべてを網羅しています。
実行時エラーでプログラムを止めたくなければ、`error "no data"` の代りにたとえば、 putStr "no data" とするか、適当な例外を投げて、`pt1` を呼び出した側で catch して例外処理するようにします。

pt2 の場合のように、λ抽象式の \〈パターン〉->〈式〉もパターン並記ができませんが、こちらは、言語拡張 LambdaCase を指定すると
(\ case
   パターン1 -> 式1
   ...
   パターンn -> 式n
)

のように書くこともできます。

また、パターンマッチを使わずに書くこともできます。`Data.Maybe` で定義されている maybe :: b -> (a -> b) -> Maybe a -> b を使います。
pt1 = maybe (error "no data") print . snd =<< func1
多段に構える、LamdaCase、maybe関数を使う、3つのパターンと回答ありがとうございます。

LamdaCaseだと警告が出てくれるんですね。
maybeは慣れるまでなかなかぱっと出てこなさそうです。

pt1のように書いてしまった場合、GHCオプションで警告やエラーにするオプションはありますでしょうか?
... Replies ...
今 sdl2 のライブラリを stack でインストールしようとしているのですが、
 sdl2> configure
 sdl2> Configuring sdl2-2.5.3.0...
 sdl2> Cabal-simple_Z6RU0evB_3.4.1.0_ghc-9.0.2.exe: The pkg-config package 'sdl2'
 sdl2> version >=2.0.6 is required but it could not be found.

こんな具合に止まってしまいます。
どうしたものでしょうか。
... Replies ...
Reminder: beginnersチャンネルは、新しい人がスムーズにHaskellに慣れるための質問を歓迎するチャンネルです。 Haskell-Beginners ML や IRCの#haskell-beginners  や RedditのMonthly Hask Anythingのような位置づけを意図しています。 beginnersチャンネルでの回答側は、以下の左側のような応答を厳禁とする運用です。 • それはくだらない質問だ → くだらない質問など無い • その質問は以前にもあった → 質問者はそんなこと知らない • Google検索せよ → 検索できないから質問している beginnersチャンネルでは、例えば以下のレベルの質問から歓迎します。 • : とは何のことですか。 • タプルとは何ですか。
math に投げるか迷ったのですがこちらで。
Hask圏が圏にならないという話をうけて、それでは代わりになる圏は今のところ考えられているのでしょうか?
... Replies ...
@hiratara has joined the channel
@ has joined the channel
@宇高大志 has joined the channel
あれから調べてみましたがわかりませんでした。
圏論の知識も不足しているのでもう少し勉強してみます。
これに関連して、トップレベルの関数に明示的な型注釈を与えるメリットは具体的に何でしょうか。型エラーの位置とメッセージが親切になるのは知っているのですが、他にメリットがあったら知りたいです
https://haskell-jp.slack.com/archives/C5666B6BB/p1659401887913139?thread_ts=1659398221.402629&cid=C5666B6BB
... Replies ...