haskell-jp / questions #4

型に言及するには,制約が Monoid しかないので,情報が足りないのではないでしょうか?
多相関数というのは割と結構強い制約で,例えばFunctor則は fmap が多相関数なのでどちらかの則があれば自動的にもう一方を満たします()
なので, Foldableも多相関数を利用してる場合その時点で割と実装が限られて来ます (もっとも,ボトムを定義中に使われると色々と壊れるのですが)
そういう意味では、多相関数を使ってなくて Functor であってもなくてもよく(Functor でもなおかつという方が面白いですが)いかにも不自然な感じのする Foldable の例があるかという質問と思ってください。
それはあり得ると思いますが,多相関数でない以上FoldableではないのでそれはfoldやfoldMapの型を特殊化したものと型が一致したただの別の関数ということになってしまうのではないでしょうか?
なお, Foldableをもう少し弱めたものならば https://hackage.haskell.org/package/recursion-schemes-5.0.2/docs/Data-Functor-Foldable.html#t:Recursive などがあります
うむむむ、リストとリスト以外のモノイドで実装を分けて書けないので多相的な実装しか書けないですね。確かに。
これがfoldのチュートリアルみたいです.これを読んでみると疑問が解決するかもしれません?(ちょっと僕も読んでみます)
http://www.cs.nott.ac.uk/~pszgmh/fold.pdf
では、木の形だけで判断するとして好きに選んだいくつかのある木のときだけは mempty にしてそれ以外では concat した値にするとしたら整合性や不自然さはどうでしょう。
多分それも代数的には意味のある構造なのだと思います.それを木という代数的構造で考えると不自然なのですが,別の代数と考えるとそのfoldを考えてるようなものなのだと思います
なので,Foldable的にはおかしくないのだと思うのですが(ちょっとFoldableの背景には明るくないので,明確には言えないです)
そもそもこのことを考え始めたきっかけは「Haskell 教養としての関数型プログラミング」に 「Foldable は並べられるという性質」とあって「並べられる」っぽっくない Foldable の例はないだろうかと考え始めたのでした。
なるほど.並べられるというより並べ方を定義するの方が分かりやすいかもしれません
foldMapを定義すれば基本的にtoListが定義できるので
まあ「並べる」とはどういう意味かということに帰着されて toList t = build (\ c n -> foldr c n t) を「並べる」ということだ言ってしまえばその通りかもしれませんが普通の直感とは多分違うような気が。
まあ確かに普通の直感とは異なるかもしれません.ただ,普通の直感の並べ方をもっと形式的に表せないかというのがfoldMapのアイデアの元になってて,
リストに対してのfoldMapが出来てそれでtoListがちゃんと表せて,木もフラットにする方法がやっぱり同じ方法で出来て,じゃあFoldableにまとめたら他の代数でも同じように並べ方が定義できるようになったという感じだと思います.
なので直感的な感覚から始まって,色々な並べるをうまく表せるFoldableを一つの並べるの定義方法だと思えば,非直感的な並べ方に対しても同じようなことができてその並べ方に沿って並べるをアルゴリズムの一部として使うようなものが一般的に書けるという点では,Foldableも並べられるという性質を持っているといって問題ないのではないでしょうか?
うーん、そうですね。上に書いたときどき mempty になる例も列に並ぶのをさぼるグループがいると考えれば「並べる」と言える気がしてきました。自分のコピーを作って複数人分潜り込ませて並ぶというのもありかな。
newtype Square a = Square a

とかだったら意味論的にはありだと思いますね
リストも(標準のリストFoldableとは違いますが)
fold [] = mempty
fold [m1] = m1 <> m1
fold [m1, m2] = m2
fold [m1, m2, m3] = m1 <> m3 <> m2 <> m3
fold [m1, m2, m3, m4] = mempty
...

のように要素と <> と memtpy だけを組み合わせているかぎりどのように定義しても Foldable になりそうですね。
あれ、toList の話に自分で build を出しましたが build は cata, ana を想定してない一般には定義されてないですよね。toList は fold からどう定義できるんでしたっけ。Foldableパッケージには toList = elems と書いてあるだけでその elems はどう定義するのでしょう。上の例では
elems [m1] = [m1,m1]
elems [m1,m2] = [m2]
...

と定義するという堂々巡りしているだけ?
どの Foldable を見てるかはよく分かりませんが,現状のbase( https://hackage.haskell.org/package/base-4.10.0.0/docs/src/Data.Foldable.html#line-230 )では, toList = build (\ c n -> foldr c n t) がデフォルトになっています. buildhttps://hackage.haskell.org/package/base-4.10.0.0/docs/src/GHC.Base.html#line-871 ですね.リストを作るためのビルダーになっていて, foldr/build変換なども適用されるようになります
一回stack buildでcabalファイルを生成してから使えばpackage.yamlにも使えるのでは?手で編集できないほど依存ライブラリの数が多ければわかりませんが…
ううう、build はそうでした。上で書いた fold の例だと toList [m1] = m1:m1:[] = [m1,m1] ですね。
elems と書いてあったのは instance Foldable (Array i) の中のところでした。
'toList = ' で検索したのが失敗だった orz。
前に書いていた fold . fmap f = f . fold は f はモノイド準同型を前提してということですか。
あ,そうですね. f がモノイド準同型であることが必要です
初歩的な質問なのですが
import qualified Data.Text as Tとすると
T.Textと型にもTが付くんですか?
ありがとうございます。
型を T.Text にしたくない場合はこんな感じで定義されてることが多いですね!

import Data.Text (Text)
import qualified Data.Text as T


Data.Mapimport する際にも良くみかけます:grinning:
wado さんの提示してるやり方よくしますね
括弧付きimportのほうが優先順位が高いんですね
モジュールの括弧は優先順位とは全く無関係です。括弧によってモジュールから import するもの (関数や型など) を明示的に列挙できます。

import Data.Text (Text)


上記は Text 型のみを import します。その際、 qualified ... as 形式ではないため Text という表記で利用できます。

import qualified Data.Text as T


上記は Text モジュールで export されているもの全てが import されます。(`T.Text`, T.null, etc...)。こちらは qualified ... as 形式なので全て T. という修飾詞つきの表記で利用できます。( Prelude や他のモジュールで定義されている関数 (や型) の名前と被る場合に使います。)
具体例:
- [Text.null]()
- [Prelude.null]()。

なので上記ように import を2つ書いた場合は Text 型は TextT.Text の両方の形式で利用できるという理解が正しいです。

ただ両方利用できても、 T.Text って書くの面倒なので Text しか使わないという感じです。

T.Textimport しないようにするためには hiding キーワードを使って明示的に import しないものを指定します。(`hiding` は暗黙的に Prelude から import されているものを隠したい場合によく利用します。 import Prelude hiding (div))

import Data.Text (Text)
import qualified Data.Text as T hiding (Text)


長くなりましたが、だいたいこんな感じだと思います。
なるほど。
ありがとうございます:musical_note:
Stackを使った開発でのghc-modの利用について質問させてください.Stackage LTS-8.xにはghc-modがあったので問題なくインストールできましたが,LTS-9.xからは外されて(?)しまい,cabal-installで別途導入しようとしても途中でエラーになってしまいます.LTS-9.xでghc-modを利用できている方はどのようにやっていらっしゃるのでしょうか.
ghc-modは、もう僕の手を離れているので、よく分かりません。
GHC 8.0.2では使えますし、僕も stack なしで使っています。
なお、ghc-modは、まだ GHC 8.2.x には対応していません。
lts-9 系でも stack install ghc-mod でインストールできたような気がします。
試しにやってみたらインストールできたようです(macOS 10.13.1, Stack LTS-9.13).LTS-9.x になって以来パッケージリストに ghc-mod が含まれていないので stack install ではできないものと思って試していませんでした.ありがとうございます.
便乗ですが、今だとEmacsでhaskellのコードを書く場合は haskell-mode を使っておくのがいいんでしょうか。(というかそれ以外に選択肢がない?)
はい。elpaに上がっているhaskell-modeが最新だと思います。
単にsyntax highlightくらいできればいいならhaskell-modeでいいと思います
もっとIDE的な機能が欲しければinteroっていうプラグインがありますね
ある typeclass の instance を reexport する方法って、Haskellにはないんでしたっけ?
普通に https://github.com/tfausak/autoexporter などでやるように module ごと reexport すればできたように思います。
ちょっと記憶が怪しい(しかもTHによる例)ので恐縮ですが、
https://github.com/igrep/typesafe-precure/blob/5dc0800ae8f8f4e002ee3d32d92ae6450b86d653/src/ACME/PreCure/Textbook/KirakiraALaMode/Instances.hs の時点のtypesafe-precureは
ACME.PreCure.Textbook.KirakiraALaMode.Instances でインスタンスしか定義していない module を export して、
更に src/ACME/PreCure/Textbook/KirakiraALaMode.hs などでreexport していました。
” All instances defined in a module A are imported automatically when importing A, or importing any module that imports A, directly or indirectly.” https://wiki.haskell.org/Orphan_instance だそうで、有無を言わさず自動的に再エクスポートされるみたいです
誰かText.EDEに詳しい人いませんか
env = fromPairs ["list" .=["AA","BB","CC"]]
こうしてもうまくレンダリングできません