kayhide
そのドキュメントを読む限りでは、*.hi とバイナリがあれば、いけそうな感じはするんですよね。
.stack-work/install/
以下に必要なものが出力されてるっぽいのですが、この中から必要な部分を抜き出して、他の環境にもっていけないかなー、と妄想してます。:loadってexportされてない関数も読めるそうだったのかー
type f :~> g = forall a. f a -> g a
などのFunctorの自然変換でよく見る type operator に使われていたりします。そちらのQiitaで使われている場合も (forall a. MyAppHandler a -> ExceptT ServantErr IO a)
の意味で使われているように思えました:
で始まる記号はただのコンストラクター(ただし中置演算子)ですよーnewtype f :~> g = NT (forall a. f a -> g a)
:
で始まる型を作れるようになっている、と理解しています。 :~>
は型なのだ、というところまでは理解できたと思います。:~>
の使用は非推奨なので,servantを使用する上では気にする必要はないです.その上でですが,この型の理解は具体的な例を考えてみるとなんとなく分かるのではないかと思い,ちょっと書いて見ました~>
や :~>
は型を省略するための記法と思って構いません(まあそれ以上の意味もあるんですが,その辺はnatural transformationで調べてもらう他ないです).どういう場合に省略できるかというと,型が f a -> g a
というように最終的に型引数 a
をとる2つの型に対しての関数型になってる時で,この時 a
は本質的でない場合が多く f
と g
にさえ着目すればいいためそういう場合の省略記号として f ~> g
というように用いられます:~>
は ~>
のnewtypeで主にCategory型クラス (forall
はRank N TypesというGHCの拡張機能で使えるキーワードです.調べて感じここの解説が一番分かりやすそうでしたので,ここを読んでみるといいかもしれません :~>
が出てきて「これは型なのか?それともHaskell言語の予約語(?)、つまりは ->
みたいなものなのか???」という疑問が出てきて、どこを調べればいいかを見失った、という背景があります。TypeOperator
は普段 Foo a b
みたいに宣言する型を、二項演算子記号で表現できる言語拡張なので :~>
はライブラリで宣言された「型」って認識で大丈夫です。 GHC.Generics
などに、独自定義された TypeOperator の例が沢山あります(自分も順を追って説明すりゃよかった…)TypeOperator
(型演算子)は:で始まる必要はありません.今回は,元々の ~>
と区別するために :~>
になってますが,data a * b = Pair a b
data Pair a b = a :* b -- a * b はダメ
return
って型じゃなくて値を持ち上げてない?import qualified Data.Text as T
as Import.T
みたいに書いても出来ないinclude
すれば一応できます。qualified
ぬけばできません?import qualified Data.Text as T import Other.Module (available, functions) import qualified Qualified.Module as ReusableShortName ....