haskell-jp / beginners #13

一時的に確認したいだけだったので、 :point_down: のコマンドを(ほぼ元のコードそのままですが)手打ちしました。

> stack haddock
> stack exec -- hoogle generate -v --local=$(stack path --local-doc-root) --local=$(stack path --snapshot-doc-root) --database=$(stack path --local-hoogle-root)/database.hoo
> stack exec -- hoogle --database=$(stack path --local-hoogle-root)/database.hoo "a -> a" # 今回は動作確認がしたかっただけなので、 a -> a という型の関数を探してみるだけ

なお、元のコードでは hoogle server を必ず実行することになっていますが、hoogleの他の機能を使いたい場合も考えるとbashの "$@" などで一般化した方がいいでしょうね。

で、本題に答えると、例えば stack-hoogle とかでいいんじゃないでしょうか。場所は本当に PATH の中の自分が触れる領域であればどこでもよいでしょう。もしなければ、この機会に自前で作ったコマンドを入れておくディレクトリーを一つ作っておいてそこにすればいいんじゃないかと。
すみません本題から外れますがこれからオンライン集合論ゼミのため反応が鈍ります。
申し訳ないです。
お気になさらず!私含めみんな気が向いたときに回答しているので!
「stack haddock」
と実行した時に以下のエラーメッセージが出ます

MacBook-Air:~ sirkerf$ stack haddock
Error parsing targets: The specified targets matched no packages.
Perhaps you need to run ‘stack init’?
あれ、global projectでは stack haddock は使えなかったっけか...
ええっと、そのエラーメッセージは、「 stack haddock はプロジェクトのディレクトリー( stack.yaml が入っているディレクトリー)でないと使えません」という旨のメッセージです。
プロジェクトを作ってから使う... でもいいんですが、本当に必要かどうかちょっと自分も確信が持てなくなってきたのですっ飛ばして stack exec -- hoogle generate ... で始まる方を実行してみてください
「stack exec — hoogle generate …」
で始まる方を実行した後に二個目実行してみました。
その後に
「stack hoogle “min”」で実行してみました。

MacBook-Air:~ sirkerf$ stack hoogle “min”
No hoogle version was found, trying to install the latest version
Minimum version is hoogle-5.0. Found acceptable hoogle-5.0.17.15 in your index, requiring its installation.
Distribution.Compat.Prelude.Internal min :: Ord a => a -> a -> a
Prelude min :: Ord a => a -> a -> a
Data.Ord min :: Ord a => a -> a -> a
GHC.Classes min :: Ord a => a -> a -> a
Data.Semigroup newtype Min a
Data.Semigroup Min :: a -> Min a
BasicTypes minPrecedence :: Int
CmmExpr minusRegSet :: Ord r => RegSet r -> RegSet r -> RegSet r
CmmProcPoint minimalProcPointSet :: Platform -> ProcPointSet -> CmmGraph -> UniqSM ProcPointSet
DynFlags mIN_CHARLIKE :: DynFlags -> Int
-- plus more results not shown, pass --count=20 to see more
必ず初めに
No hoogle version was found, trying to install the latest version
Minimum version is hoogle-5.0. Found acceptable hoogle-5.0.17.15 in your index, requiring its installation.
が表示されるようです。
ともあれ、hoogleの機能は利用できるようになったのでありがとうございます。
残った問題についてもできれば解決したいですが、また機会がありましたらお願いします。ありがとうございました。
連日ありがとうございます、また機会がありましたらお願いします。
Haskellのコーディングでの質問です。

multiply :: Int -> Int -> Int
multiply a b = a * b

main = do
return $ multiply a b

をしようとしたのですがうまくいきません。
エラーコードは

MacBook-Air:haskell_sutdy sirkerf$ runghc multiple.hs 

*multiple.hs*:eight:*23: error: Variable not in scope: a :: Int*
 *|*
*8 |*   return $ multiply *a* b
 *|            ^*

*multiple.hs*:eight:*25: error: Variable not in scope: b :: Int*
 *|*
*8 |*   return $ multiply a *b*
 *|             ^*

となります。
Variable not in scopeのエラーを調べてみても「型が合ってない」としか言われないのですが、そもそもaとbはIntのはずですからこのエラーはおかしいように感じるのです。
どなたか、このコードが通るように改変していただけませんでしょうか?
ちなみに最後を「return $ multiply 2 3」と具体的なIntのものにすると通ります。
推測するにaとbが具体的な型を持っていないと見られているのが問題だと思っています。
aとbが定義されていないというエラーです。
a :: Int
a = 2
b :: Int
b = 3
などと定義を追加すれば動きます
動きました。ありがとうございます。
ところが件のコードは
「module Multiply.Bug.Fix where

multiply :: Int -> Int -> Int
multiply a b = do
return $ a * b」

この誤りを正せ
と言う問題だったのでさっきのコードになったのですが、具体的な値を入れると怒られてしまいました。
「module Multiply.Bug.Fix where
multiply :: Int -> Int -> Int
multiply a b = a * b」

で通りました。ありがとうございました。
No hoogle version was found, trying to install the latest version
Minimum version is hoogle-5.0. Found acceptable hoogle-5.0.17.15 in your index, requiring its installation.
についてはよくわかりません。インストール自体は済んでいるでしょうし、stackのバグではないでしょうか。
@Yasuhiro has joined the channel
@Jaeseung Han has joined the channel
はじめまして、どうぞよろしくお願いいたします。

ある型について、とりうる値をすべてリストで列挙する方法はありますか?

data DrinkMenu = Oolong | OrangeJuice | Cocktail deriving Show

のようなデータ型があるとして、
構文としては正しくないのですが、理想としては下記のようなことができればいいなと思っています
> show $ enumrate DrinkMenu 
[Oolong, OrangeJuice, Cocktail]

似たようなことができる方法をご存じでしたら、教えていただきたいです
deriving Enum で自動的にEnumクラスのメソッドが得られます http://walk.northcol.org/haskell/type-classes/
data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat
deriving (Enum, Show)
main = print [Mon .. Fri] -- 出力: [Mon, Tue, Wed, Thu, Fri]
また、deriving Boundedにすると最初と最後が得られます

data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat
deriving (Enum, Bounded, Show)
main = do print $ (minBound :: Day) -- 出力: Sun
print $ (maxBound :: Day) -- 出力: Sat
ありがとうございます!やりたいことができました。
(なんとか型を値として渡す方法を考えなければ..と思っていたので、目からウロコでした)
@Yudai Tanabe has joined the channel
@sh9 has joined the channel
かなり基本的な質問なのですが答えてくださる方を募集します。
数学では「随伴関手の合成はモナドを成す」という事実があるのですが、これはHaskellでも同様でしょうか?
つまりFunctorからMonadを作ることって出来るのでしょうか?
FunctorはFunctor則を
MonadはMonad則をそれぞれ満たさなければならないので、Haskellでだとなんだか整合性が取れないのではないかと推測しています。
それから追加質問で恐縮なのですが、
「Haskellにおける随伴関手の例」って何かありますでしょうか?
更に追加で質問しますが、数学では「モナドTからT代数を構成できる」という事実がありますが、これはHaskellでも同様ですか?
Haskell の Functor と Monad は、圏論の関手とモナドを使いやすいように特別な場合に限定したものであり、また Haskell が厳密には純粋ではないこともあり、同じ概念として捉えることは出来ません。
随伴関手としての条件を満たす二つの Functor があれば、そこから Monad を作ることが出来ます。そのようなペアとしては (->) r と (,) r があり、そこから State Monad を作ることが出来ます。
ありがとうございます。同じ概念として捉えることはできないんですね。
Monadを作ることができるFunctorの具体例まで教えていただきありがとうございます。


ところでですが、HaskellのFunctorやMonadは数学で定式化するとしたらどのような概念になるのでしょうか?追加の質問で申し訳ないです。
次のように作られる圏を Hask 圏と呼びます。

• 対象: Haskell の型 (Int, Maybe Bool, [String], ...)
• A から B への射:
A -> B という型を持つ関数

Functor は Hask 圏から Hask 圏への関手です。 Monad は Hask 圏の上のモナドです。
ただし、この Hask 圏は、現実の Haskell では圏にならないので、理想化した Haskell の中で考える必要があります。そのあたりの事情を無視しても Functor と Monad が便利なのには変わらないので、問題とされることは少ないようです。
Reminder:
beginnersチャンネルは、新しい人がスムーズにHaskellに慣れるための質問を歓迎するチャンネルです。
Haskell-Beginners ML や IRCの#haskell-beginners や RedditのMonthly Hask Anythingのような位置づけを意図しています。

beginnersチャンネルでの回答側は、以下の左側のような応答を厳禁とする運用です。
• それはくだらない質問だ → くだらない質問など無い
• その質問は以前にもあった → 質問者はそんなこと知らない
• Google検索せよ → 検索できないから質問している
beginnersチャンネルでは、例えば以下のレベルの質問から歓迎します。
: とは何のことですか。
• タプルとは何ですか。
Hask圏を考えるのですね。ありがとうございます。

問題とされることも少ないとのことで、その辺りの事情も知れて良かったです。ありがとうございました。
Haskell における随伴は myuon_myonさんのという記事が参考になると思います。
また、数学的な話題用の部屋 math もどうぞ。
@hatsugai has joined the channel
@yusuken_ has joined the channel
ありがとうございます。返事遅れてすみません。
@ has joined the channel
久しぶりにhaskell触ってみようとしてつい~/.stackを消してインストールし直したらstack setupでコケてしまいました
意味のなさそうなところが長すぎて見づらいので最後の方だけ。あと~/.stackをゴミ箱から回復してもダメでした
ぱっと検索して見つかった、怪しいのはこれですかねぇ https://github.com/commercialhaskell/stack/issues/4884
ウチのarchlinux /home がntfsだしそれっぽさはありますね
make install のほうで出るエラーは stack setup のときは出ないエラー(`make install` を直接走らせると`/usr/local` にファイルを作ろうとして権限がないと怒られるが`stack setup`だと`~/.stack`内にファイルをおくので大丈夫)
2020-12-14 16:34:52.615504: [error] '/builds/ghc/ghc/inplace/bin/ghc-stage1' does not refer to an executable and
2020-12-14 16:34:52.615564: [error] the program is not on the system path.

は普通に未解決です
ext4にフォーマットしたスパースファイルを ~/.stack にマウントするという若干の力技で解決しました
https://qiita.com/lotz/items/1cf6f620c9fd02f82070 に書いてあるような方法でherokuにデプロイすること自体は成功したのですが、毎回毎回依存ライブラリを全部コンパイルしてるせいでデプロイに20分ぐらいかかるのが気にくわないです。これを回避する方法ってありますか?
cabalファイルをデプロイするたびに変更している感じでしょうか
1. BuildKitのcache mountを利用する
2. 重い依存ライブラリだけcabalをコピーする前にビルドしてキャッシュが効くようにする
などの回避策があると思います
意図を外しているかもしれませんが、以下は私が行っている方法です。
まず、依存ライブラリ群のみをビルド/インストールしたDockerイメージを作って、それをDockerHubにpushしておきます。
そして、Heroku用のDockerfileの先頭Fromで、上記 Dockerイメージをベースに指定すれば、ライブラリ群がインストール済みの状態から、自分のコードのビルドを始められます。 どうでしょう?:slightly_smiling_face:
@ma.tana has joined the channel
Reminder:
beginnersチャンネルは、新しい人がスムーズにHaskellに慣れるための質問を歓迎するチャンネルです。
Haskell-Beginners ML や IRCの#haskell-beginners や RedditのMonthly Hask Anythingのような位置づけを意図しています。

beginnersチャンネルでの回答側は、以下の左側のような応答を厳禁とする運用です。
• それはくだらない質問だ → くだらない質問など無い
• その質問は以前にもあった → 質問者はそんなこと知らない
• Google検索せよ → 検索できないから質問している
beginnersチャンネルでは、例えば以下のレベルの質問から歓迎します。
: とは何のことですか。
• タプルとは何ですか。
@Aumy has joined the channel