haskell-jp / questions #29

Semigroup の <> って、なんで右結合なんですかね。
Alternative の <|> は、左結合なのに。
a <> (b <> c) = (a <> b) <> c を達成するには、左が勝つようにしなければならず、嬉しくないです。
コンフィグを Semigroup にした場合、
conf1 <> conf2 <> conf3
と書けば conf3 が最優先されるようにしたいです。。。
++もinfixrなんで、そのアナロジーかなぁ、と。
a <> (b <> c) = (a <> b) <> c associativity law を要求されているので、右結合でも左結合でも a <> b<> c の計算結果は変わらないような? 何か質問の意図を勘違いしているでしょうか。
あー、そうですね!
brew install haskell-stack
がstackをソースからコンパイルしちゃう件って、今でもそうなんでしょうか。
本来stackはコンパイル済みの実行ファイルからインストールした方が時間もかからないし安全なやり方なんですが、以前見たときはそうなっておらず、わざわざGHCをインストールしてstackのビルドから始めるという面倒な仕様でした。
で、当時報告しようと思って、「その前にDiscourseというのを使ったフォーラムがあるみたいだしそっちでの相談からするか」と思ったらバグにハマってしまったのかログインできず、どこに報告すればいいかもわからなくて詰んだ、ということがあったんですが。。。
homebrew-coreは基本的にソースからビルドする方針でバイナリインストールはCIでビルドしたbottoleのみ、それ以外のバイナリはhomebrew-caskでという方針だったような気がします。方針はどこかに書いてあるかなあ。
なるほどそういうポリシーなんですね。。。確かに言われてみればどこかで聞いた気がする。。。悩ましいな。。。
昔 cask に登録したんですが、 haskell-stack と重複するということで消されちゃいましたね…
https://github.com/Homebrew/homebrew-cask/commit/f3401525970dc2e0f3caf12b25f15ad74466f716#diff-d33387f91fa14758d5d2cd457700fcbe
むー、わざわざ消したと言うことはそれなりの理由があるってことですよね。。。
なんでバイナリーよりソースコードからのインストールを優先したんだろう。
「brew installで入れないで」という記事でも書こうかと思ったけどその辺踏まえてからの方が良さそうですな。。。
(昔の事情はよく知りませんが,)最新のだと普通にbottleにstackのバイナリがprebuiltで入ってる気がしますね
tar tf ~/Library/Caches/Homebrew/downloads/1e4899432ad59163362a51ca3f2df23d87312f999ac5fb08948a8d0cc59e14b3--haskell-stack-1.7.1.high_sierra.bottle.tar.gz
haskell-stack/1.7.1/
haskell-stack/1.7.1/.brew/
haskell-stack/1.7.1/bin/
haskell-stack/1.7.1/ChangeLog.md
haskell-stack/1.7.1/INSTALL_RECEIPT.json
haskell-stack/1.7.1/LICENSE
haskell-stack/1.7.1/README.md
haskell-stack/1.7.1/bin/stack
haskell-stack/1.7.1/.brew/haskell-stack.rb
おっ、 https://github.com/Homebrew/homebrew-core/blob/master/Formula/haskell-stack.rb を読んだ限り相変わらずビルドしてるのかな、と思ってましたが、違うのか。
読んだだけじゃわからないもんですね。
bottleのセクションがCIでビルドしたバイナリのハッシュです
なんでバイナリーよりソースコードからのインストールを優先したんだろう。
stack はコマンドラインツールなので、 GUI が中心の cask ではなく brew がふさわしいという判断だったようです。ソースコードからビルドされてしまう (キャッシュされるにせよ) ことは考えられていないように見えます。
https://github.com/Homebrew/homebrew-cask/issues/15603#issuecomment-170067179
@legokichi has joined the channel
HaskellにおいてListの抽象化としてMonoidやSemigroupが導入されたんだと思うと、Listに対して foldr を使うことが多いHaskellで右結合になるのは自然な気がします
最後の設定が優先されるようにしたいのなら、 Data.Monoid にある Last を使ってはどうでしょうか? LastSemigroup にもなっています。

http://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Monoid.html#t:Last
@tmaki1018 has joined the channel
@tokoyax.dev has joined the channel
osx上でstackを使って`HDBC-postgresql`をビルドすると、`pgtypes.h` ()で定義されてる定数が存在しないとのようなエラーが起きて困っています。
環境により発生したりしなかったりするようで、私自身は再現できず、まだ深く追えてないのですが、この問題に見覚えがある方いませんでしょうか?

  [2 of 2] Compiling StackSetupShim   ( /Users/xxx/.stack/setup-exe-src/setup-shim-mPHDZzAJ.hs, /private/var/folders/hj/07whzwn919z_mltvgj717dy80000gp/T/stack29944/HDBC-pos
t/x86_64-osx/Cabal-2.2.0.1/setup/StackSetupShim.o )
    Linking /private/var/folders/hj/07whzwn919z_mltvgj717dy80000gp/T/stack29944/HDBC-postgresql-2.3.2.5/.stack-work/dist/x86_64-osx/Cabal-2.2.0.1/setup/setup ...
    Configuring HDBC-postgresql-2.3.2.5...
    Preprocessing library for HDBC-postgresql-2.3.2.5..
    /private/var/folders/hj/07whzwn919z_mltvgj717dy80000gp/T/stack29944/HDBC-postgresql-2.3.2.5/PTypeConv.hsc:53:16: error: use of undeclared identifier 'PG_TYPE_CHAR'
	hsc_const (PG_TYPE_CHAR);     
(省略)
    fatal error: too many errors emitted, stopping now [-ferror-limit=]
    20 errors generated.
    compiling .stack-work/dist/x86_64-osx/Cabal-2.2.0.1/build/Database/HDBC/PostgreSQL/PTypeConv_hsc_make.c failed (exit code 1)
brew install postgres

すると,
$ brew ls postgresql | grep pgtypes.h
/usr/local/Cellar/postgresql/10.5/include/pgtypes.h

というのが入ってきて,これが優先されてincludeされた結果,HDBC-postgresqlのpgtypes.hは読み込まれずそのままエラーになるらしいです
@mizunashi-mana ありがとうございます!
GHCの言語拡張のうち、デフォルトで有効になっているものの一覧ってどこにありましたっけ。。。user guideのどこかにあったようななかったような。。。
答えになっているかわからないですが、色々調べた結果です。

https://www.stackage.org/haddock/lts-12.14/haskell-src-exts-1.20.3/src/Language.Haskell.Exts.Extension.html#ghcDefault

-- Not exported, just used locally in several places.
allLangDefault :: [KnownExtension]
allLangDefault = [MonomorphismRestriction, MonoPatBinds, ImplicitPrelude]

ghcDefault :: [Extension]
ghcDefault = map EnableExtension (NondecreasingIndentation:allLangDefault)


ghci

*Main> :show language
base language is: Haskell2010
with the following modifiers:
  -XNoDatatypeContexts
  -XNondecreasingIndentation


ghc

module Main where

import GHC
import GHC.Paths (libdir)
import MonadUtils (liftIO)
import EnumSet (toList)

main :: IO ()
main =
  runGhc (Just libdir) $ do
    flags <- getSessionDynFlags
    liftIO $ print $ toList $ extensionFlags flags

{- 実行結果
[ MonomorphismRestriction
, RelaxedPolyRec
, ForeignFunctionInterface
, ImplicitPrelude
, DoAndIfThenElse
, EmptyDataDecls
, PatternGuards
, NondecreasingIndentation
, TraditionalRecordSyntax
]
-}
ありがとうございます。
https://twitter.com/igrep/status/1056028202722721793 で気になったExtendedDefaultRulesについては載ってなさそうですね。。。 :thinking_face:
その拡張なら、 ghci では別途有効になるはずです。

https://github.com/ghc/ghc/blob/master/ghc/GHCi/UI.hs#L433

dflags <- getDynFlags
   let dflags' = (`xopt_set` LangExt.ExtendedDefaultRules)
               . (`xopt_unset` LangExt.MonomorphismRestriction)
               $ dflags
   GHC.setInteractiveDynFlags dflags'
なるほどGHCi限定かー!どおりでー!
wadoさんがまとめ済みですが、GHCiでの話はここみたいです。
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#type-defaulting-in-ghci

GHC実行時のフラグ一覧と言語拡張一覧は各々以下ですが、肝心の言語拡張の方は、一覧からはデフォルトの状態はわからないですね〜。
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/flags.html
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#options-language

面白そうなのでちょっと見てみました。 GHCのコードだと、たぶん、ここではないかと思います(GHCiは除いて。)
https://github.com/ghc/ghc/blob/ghc-8.6.1-release/compiler/main/DynFlags.hs#L2132:L2144
@yharuhi39 has joined the channel
ここで質問するか、randomチャンネルで質問するか迷ったのですが、 こちらで書かせて頂きますね。 どうして data T = forall a. Show a => T a deriving Show ってのはだめなんでしょうか、無論自分でインスタンスを書けばShowのインスタンスになるのは当然なんですが、 変数a は必ずShowのインスタンスである事が保障されてるので Showのインスタンスは機械的に導けると思うのですが。 例えば、T 型でEq を導きたいとかなら変ってくるとは思いますが。
Gadtsやexistential typeは、自動導出されたものが正しいかはtype checkしてみないと分かりません(Haskell標準のものは自動導出されるものが必ずtype checkが通ることが保証されています)。なので、構文だけからvalidか判断できる機能とできない機能を分けるため、使えないようにしたのだと思います。

StandaloneDerivingを使うと、自動導出をしたものにtype checkをかけることで、deriving可能にしています。このため、自動導出で生成されたものが型エラーを吐くこともあります。これが結構大きな差異ということなのでは無いですかね?
@yamanasirio_mia has joined the channel
初めまして、当方Slack初経験、プログラミングも初級〜中級者です。とても未熟な質問だとは思いますが、お答え出来る方いらっしゃいましたらお願いします。
以下Yahoo知恵袋にて質問したものと同文になってます。
---
macでインストールしたのにどこにも表示されないです。

macbookProを使っています。
一年前にHakellのVer.7を持っていて、その時は有識者の方にインストールしてもらって、去年の夏に同じ方に最新版のVer.8にアップデートしてもらったはずなんですが、自分でHaskellを起動しようとしてVer.7が残っていてうまく動かなかったため、ターミナルでVer.7を消しました。(この時点で7しか動かず、8は存在していると表示されてるけど居場所はわからない状態でした)
すると、ターミナルでghciというHaskellを起動するコマンドを打ったら、見つからないと言われたので、リセットしようと思い8も7も消しました。でも環境の再設定はやり方がわからなかったら嫌なので、全リセットはしていないと思います。
そのあとにネットから再度haskell platformをダウンロードしたのですが、インストールが完了しましたとでても、どこに保存されているのか全くわかりません。Spolightの検索でも見つかりませんでした。
このmacについて>システムレポート>アプリケーションを開いたらhaskellは載っていなく、インストールの欄をみると、Haskell Platform 8.4.3が載っています。
解決方法は何かありませんか?
macのOSは最新状態になっています。
---
お目汚し失礼致しました。
私もMacはあまり得意じゃないのですが、 Haskell Platform のインストール手順に従ってインストールしたのなら、stack というコマンドが使えるようになってるはずなのですが。 いかがでしょうか?
即出ならすみません。 のCopyrightが昨年度のままになっております。こちらは意図があっての事でしょうか。
お忙しい中恐れ入りますが、オーナー様、ご返答のほどよろしくお願いいたします。
体裁の問題はありますけど、別に法的な問題があるわけでもないので急いで更新しなくてもいいかな... という感じです。気が向いたら更新します。
承知です。ハスケルに少し興味をもったプログラマーの方が気にしていらしたので少しだけ胸に留めていただけますと幸いです。お忙しい中ご返答ありがとうございました。
本当に初心者でターミナルの使い方がよくわからないのですが、それは、stack Haskell 8.4.3とターミナルで打てば良いということですか?
ターミナルで stack と打てばいいです。
Haskell Platform って stack 入るっけ?
不安になって調べ直してみましたが、
Minimal installers provide centrally the GHC compiler and the Cabal and Stack tools for installing packages. Some may install further build tools (i.e. for parsing and lexing) as well.
と書いてあるので入ってるはずです。
へぇそうなんだ
ちなみに、ぼくは stack を直接インストールして使ってます
https://docs.haskellstack.org/en/stable/install_and_upgrade/#macos
私も基本的にはそうです。。。 というかstackを直で使うっていうのが デファクトスタンダードなんじゃないんでしょうか?
あとはmacだったらHomebrew は入れといた方がいいですよね。。。(個人的には必須って言いたいところですけど)
まって神ですか???????
ちゃんと使えるようになりました:sob::sob::sob::sob::sob::sob::sob::sob::sob:
ありがとうございました!!!!感激感謝です!
stackとHomebrewは調べましたが、インストールすることでの確実な利点がよくわからないです…
使用履歴1年になってもまだ使い方が安い型落ちのWindows使うのと大差ないですが、できれば使いこなせるようになりたいです…!
ちなみにこんな感じだったらやっぱりmacの本とか見たほうがいいですかね?
コピーライト表記の年は公開年を示すという説もあり
ふむ、なにか他のプログラミング言語でプログラミングしたことはありますか?