haskell-jp / beginners #3

初心者ですが
はじめテキトーに書いてコンパイラが怒ってくれるのを導きに修正していくという書き方ができるので
楽だし、すごく楽しいですね
あまりに嬉しいので投稿しました
@ymdpharm has joined the channel
すごいH本にMonoidの章があると思いますが、Monoidは実際のプログラムでどのように役立つのでしょうか?
すごいH本には色々なデータ構造に対して畳み込みができる!みたいな例を出していましたが、他の例も知りたいです!
Monoidの結合則を利用した応用方法として https://chrispenner.ca/posts/wc を挙げておきます。
ざっくり言うと、Monoidの重要な法則である結合則は「どんな順番で結合( <> を適用)しても、各演算の左辺と右辺さえ変わっていなければ結果は変わらない」という性質なので、この記事では、単語や行を数える問題をMonoid則を満たすように分割することで、並列処理してバラバラに実行しても、結合するときは正しく計算されるようにした、という例です。
なるほど!とても面白そうな使い方で驚きました
ありがとうございます!!
@qryxip has joined the channel
Non-exhaustive patternsはコンパイル通ることがあるのですね、気をつけなければ
GHCに -Werror-Wall オプションを付ければエラーにすることができます。
stack build --pedantic はそのショートカットです。
ありがとうございます!
Persistent で Integer 型のフィールドを定義する方法はあるのでしょうか
テーブル定義で Integer とすると、そんなものはないと言われるので仕方なく Int にしています
PostgreSQLの場合、内部的には bigint で扱ってくれているようです
ところがHaskell側にもってくると、やはり正体は Int です
20億は超えてくる可能性があるので、Integer で定義したいのですが...
persistentは全く使ったことがないので伺いたいのですが、
そんなものはないと言われる
というのはどんなエラーですか?
はい、少々お待ち下さい
おまたせしました、そのまま貼ります
Int64 もありそうでないのです
terminal というのはフィールド名です
No instance for (persistent-2.9.2:Database.Persist.Sql.Class.PersistFieldSql Integer
これはやはり Integerpersistent パッケージの Database.Persist.Sql.Class.PersistFieldSql のインスタンスにするのが正解、ってことなんでしょうね。ただ、一般にRDBがサポートする整数型に多倍長のもの(最大値が無限のもの)はないため、自明なインスタンス定義がない、ということなんでしょう。
でも、 Int64 については https://hackage.haskell.org/package/persistent-2.10.4/docs/Database-Persist-Sql.html#t:PersistFieldSql を読む限り定義されている、ような...? :thinking_face:
そうなのです
Int64 とするとまた別の短いメッセージがあります
import が必要ですね。
Int64Prelude にありません...
定義できたみたいです、ありがとうございます
一つ忘れてた。
Int は64bitな環境であればちゃんと64bitになります... まぁ、精度を明示するのはいい作戦だと思いますが。
@linguini has joined the channel
@apo has joined the channel
@apo has joined the channel
@ has joined the channel
ghciを起動すると、`Prelude>` と表示されます。これはどういう意味・意図ですか? [連載QA]
これは、ghciが現在読み込んでいるモジュール(importしているモジュール)を表しています。
つまり現在、"Prelude"モジュールが、importされていることを示しています。
ghciは起動時に暗黙的・自動的に、"Prelude"モジュールをimportするため、それが表示されています。

例えば、次のように、"Data.List"モジュールを追加でimportすると、それらがプロンプトに追加されます。
Prelude> import Data.List

Prelude Data.List> 

なお、次のように、`set prompt`コマンドにより、プロンプトを変更することが出来ます。
Prelude> :set prompt "ghci> "

ghci> 

また、`~/.ghci` ファイルを作り、次のように設定を書いておくと、ghciのデフォルトのプロンプトを変えることが出来ます。
:set prompt "ghci> "
@ has joined the channel
@tk has joined the channel
@tsubo has joined the channel
Reminder:
beginnersチャンネルは、新しい人がスムーズにHaskellに慣れるための質問を歓迎するチャンネルです。
Haskell-Beginners ML や IRCの#haskell-beginners や RedditのMonthly Hask Anythingのような位置づけを意図しています。

beginnersチャンネルでの回答側は、以下の左側のような応答を厳禁とする運用です。
• それはくだらない質問だ → くだらない質問など無い
• その質問は以前にもあった → 質問者はそんなこと知らない
• Google検索せよ → 検索できないから質問している
beginnersチャンネルでは、例えば以下のレベルの質問から歓迎します。
: とは何のことですか。
• タプルとは何ですか。
@ has joined the channel
@kuwana-kb has joined the channel
@Masaki Ono has joined the channel
@yoshi has joined the channel
@Dora has joined the channel
@maina has joined the channel
@matsuzono has joined the channel
stack を使い始めたのですが、いつの間にか ${HOME}/.stack ディレクトリ以下にいろんなバージョンの ghc がインストールされて、とんでもないサイズになっていました。特にこだわりはないので、最新の ghc だけを利用するようにしたいのですが、どうしたらよいでしょうか?
「絶対に古いGHCをインストールしたくない!」というのはstackの設計思想上難しいです。
stackは、パッケージのバージョンとGHCのバージョンを組み合わせて「resolver」としてまとめて固定することで確実にビルドすることを保証する、というソフトウェアなので。

単純にもう使わないであろうGHCを消したい、という場合は、単純に対象のGHCがインストールされているディレクトリーを探して削除しましょう。

手元の環境はWindowsなのでMacやLinuxの場合は自信がないのですが、
~/.stack 以下のどこかに ghc-8.6.5 などといったディレクトリーがあるはずです。

ただし、そうして削除した後でも、もう一度対象のGHCに依存したパッケージのディレクトリーで stack build を実行すると、再度インストールすることになってしまうので「このバージョンのGHCに依存するパッケージはもうビルドしない!」と確信が持てているときだけ削除してください。
ご回答有り難うございます!該当ディレクトリを見つけて古いバージョンのものを削除しました。が、stack run するとまた古いバージョンのものをダウンロードしにいってしまいます。。。通信費も馬鹿になりません。おそらく、プロジェクトの設定ファイルに ghc のバージョンなどが記載されていると思うのですが、適切な設定の仕方がわかりません。。。教えていただけると幸いです。
特に stack.yaml ファイルがあるディレクトリーではない、ってことですよね?
であれば、 ~/.stack/global-project/stack.yaml に、そのresolverの情報があります。
resolver: lts-XX.X などと書かれている行を、
resolver: lts-14.20 と、最新のLTS Haskellのresolverに書き換えてください。
なお、最新のLTS Haskellは https://www.stackage.org/ から確認できます。
stack で作ったプロジェクトに stack.yaml があり、resolver ghc-x.x.x とバージョンの指定があるのは発見したのですが、実際にダウンロードされるバージョンが違うので、???となっているところです。グローバルな設定の場所を教えていただいたので、確認してみます。
解決しました!
グローバルな設定は最新になっていました。その状態で stack new でプロジェクトを作ったら ghc-8.6.5 (つまり最新版)でビルドできました。しかし、以前作ったプロジェクトでビルドすると、古い ghc をダウンロードしようとします。
私のミスは、stack.yaml で ghc のバージョンを見ていたのですが
そもそもこの行はこめんとになっていました。有効な行には lts のバージョンが resolver 指定されていました。古いバージョンで。(笑い なので、このバージョンを最新の lts-14.20 に指定したところ、最新版でビルドできました。

ありがとうございました!
@カーメ has joined the channel
@tanaq has joined the channel
Visual Studio Codeに、Haskell Language Server拡張機能を入れ、
stack new testproj
として新しいプロジェクトフォルダを作成してみたのですが、
app/Main.hs や src/Lib.hs を開くと、
"cannot satisfy -package-id testproj-0.1.0.0-KBO0DtDRnIlBNwJajDqsEP\n (use -v for more information)"
というアラートが出ます。
このアラートはどのような意味でしょうか。どう対処すればよいのでしょうか。
OS は MacOS Catalina 10.15.2 です。
もうしばらくして、わからなそうなら questionsチャンネルでも聞いてみますね
hie のバージョンっていくつですか?(以下のコマンドで確認できます。)

$ hie --version
Version 1.0.0.0, Git revision 1542fa2ee7485ce5db19f6c07fc96e7a39b4c5d5 (dirty) (3571 commits) x86_64 ghc-8.6.5