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 ...
Masaya(M_simplifier)
Yesodプロジェクトのセットアップについての質問です。
https://www.yesodweb.com/page/quickstart
こちらの手順に従ってセットアップを試みると、Progress 4/16 fsnotifyというところで止まり、先に進まなくなります。
かなり長く放置していても一向に進む様子がありません。
また、複数回試していますが、同じことになります。(今も放置中です)
環境はWindows11で、GHCやStackはghcup経由で入れています。
stackのバージョンは 2.7.5のようです。GHCのバージョンは普段使ってるものは8.10.7です。(Yesodのセットアップの際にプロジェクト限定のGHCがインストールされているのなら、違うバージョンが動作してるのかもしれません。まだ初心者なためあまり良くわかっておりません)
もし誰か解決策などご存じの方いましたら、お教えいただけると幸いです。
... Replies ...
@def has joined the channel
Category Theory for Programmerについて質問させてください。
Part2の2章「」のLimit as a Natural Isomorphism節の最後で、coneの圏の射の集合C(c, Lim D)とconeの集合Nat(Δc, D)の間にnatural isomorphismがあるときのみlimitが存在する、というような定理が示されています。(と思っています。。)
これについてC(c, Lim D)は定義からしてlimitがあることが前提の表現に見えたのでこの定理がしっくり来ていません。。limitがあるならば上記の集合間にnatural isomorphismがあるであれば納得がいきます。
そもそも誤訳もしていそうだと感じていますので、どなたかご教授いただけますと幸いです。
... Replies ...
@ has joined the channel
kenji takahashi
@kenji takahashi has joined the channel
@asaotani has joined the channel
@kohei wada has joined the channel
ここでの質問が適切でなければ申し訳ありません
plutusのproject内でcabal update やcabal buildをすると
fatal : reference is not a tree: f827a4321e42f528e25f6079f7af3eb18f10d391
というエラーが出てしまうのですが、
どう解決したら良いでしょうか?
もし不適切でしたらcabal updateが行っていることを教えていただけないでしょうか?
... Replies ...
conduit の勉強をしていて詰まってしまったので質問させてください。
words.txt から 「apple」 以外の単語を出力させる意図で、下のようなコードを書いたのですが、
実行してみると 「apple」以外の単語も除外されてしまっているようです。
文字列型の扱いが間違っていそうな気がするのですが、原因がわからず。解決方法を教えていただけますでしょうか。

words.txt の中身は https://github.com/tabatkins/wordle-list/blob/main/words です。

module Main where

import Conduit
import Data.Conduit.Binary as CB
import Data.ByteString (ByteString)
import Data.ByteString.UTF8 (toString)

main :: IO ()
main = do
    res <- runConduitRes $ pipeline "./words.txt"
    Prelude.mapM_ print res

producer :: MonadResource m => FilePath -> ConduitT i ByteString m ()
producer file = sourceFile file .| CB.lines

string :: Monad m => ConduitT ByteString String m ()
string = mapC toString

filtering :: Monad m => ConduitT String o m ()
filtering = dropWhileC ( == "apple")
-- filtering = dropWhileC (const True)

pipeline :: MonadResource m => FilePath -> ConduitT i o m [String]
pipeline file =  producer file .| string .| (filtering >> sinkList)

実行結果
$ stack run | grep "apple"
"apple"
... Replies ...
@ has joined the channel
Motoyuki Kimura (M.Kimura)
@Motoyuki Kimura (M.Kimura) has joined the channel
@なっつ has joined the channel
@arark has joined the channel
@sashi has joined the channel
@ has joined the channel