haskell-jp / questions #31

例えば、"Applicative f => (a -> f b) -> s -> f t"で検索したらlensパッケージのTraversalがヒットして欲しい、みたいな具合です
型シノニムだけ結果に表示するようなオプションは見つけられませんでした…
型変数名が同じなら Google は一応見つけてくれましたが、不便は不便ですね。
https://www.google.co.jp/search?q=%22Applicative+f+%3D%3E+%28a+-%3E+f+b%29+-%3E+s+-%3E+f+t%22
なるほど。。。Haddockに直接相談しないとどうにもならなさそうですね。。。 :disappointed_relieved:
この関数って安全ではない気がするんですが、型レベルの分岐が出来る仕組み (Type Families とか) がプリミティブじゃないので大丈夫、だったりするんですか? http://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Type-Equality.html#v:inner
これを見る限りは,value type constructorとtype functionは明確に区別されていて,primitiveのreflexive axiomはvalue type constructorのみに提供されているように見えますね(今はkind equalityが入ってるのでそっちで大丈夫なのか分からないですが)
https://www.microsoft.com/en-us/research/wp-content/uploads/2007/01/tldi22-sulzmann-with-appendix.pdf
@masuwo3 has joined the channel
ありがとうございます!読んでみます
@koishimst has joined the channel
@cliff.asura has joined the channel
stackって「特定のbinをstackローカルのbinパス以外にインストールする」という用途は想定していないんですかね。stack環境無しでも動くexeを作って圧縮して配布、みたいな事を考えた場合はcabalでビルドする事を考えないと駄目でしょうか
今やろうとしてるのはbinじゃなくてdllなんですが、それだと更にハードルがいくつかありそうです
stack --local-bin-path /path/to/install install hoge ではダメなんですかね。
dllはわからないですが。。。
ああ、 --local-bin-path でインストールされた奴はstack execなしでも動きますね。.stack-work/install以下と混同してたっぽいです。
libとかincludeはそこにインストールされないんですが、それはdll固有の問題のようです
ああ、これすれば、Windows eshell でstack install した時に現在ディレクトリに~ とかいう謎ディレクトリが作られるの抑えられるのかな?
stackのconfig.yaml(Windowsだとデフォルトで C:\sr\config.yaml になるはず)で、 local-bin-pathで指定すれば、オプションで指定しなくてもそうなるはずです。 https://docs.haskellstack.org/en/stable/yaml_configuration/#local-bin-path
1.15.1のDhallでInject, Interpretの型クラスインスタンスを定義した際に以下のように定義して、dhallファイルをパースしようとすると無限ループにはまるのですが、回避策などはありますか。

data Person = Person {
      pName :: !Text
    , pAge  :: !Natural
    } deriving (Eq, Show)

instance Interpret Person where
    autoWith _ = autoWith $ defaultInterpretOptions {fieldModifier = T.drop 1}

instance Inject Person where
    injectWith _ = injectWith $ defaultInterpretOptions {fieldModifier = T.drop 1}


Interpretなら以下の方法で定義すればいいんだけど、
http://hackage.haskell.org/package/dhall-1.15.1/docs/Dhall.html#t:RecordType

instance Interpret Person where
    autoWith _ = record $ 
        Person <$> field "name" strictText 
               <*> field "age" natural


Injectの場合、dhall-1.15.1ではdefaultInterpretOptionsを使う以外方法が見当たらないのです。
InputType Person を自分で定義してあげないといけない予感?
ソースコードを見た限りそうなんですけど、レコード型のInputTypeを定義するサンプルコードが見当たらないんですよね。。
http://hackage.haskell.org/package/dhall-1.15.1/docs/src/Dhall.html#line-865
RecordLits 直接いじろうとしてもValueの肩が Exp Src X なのでうまく行きそうにないですね自前でレコードの Interpret インスタンス書いたときそれで詰まった気がします。現状レコードは柔軟に型定義できなさそうです
@a_kirisaki
ありがとうー
思いっきり裏技になりますが、以下の方法なら可能でした(多分やったら怒られそう)

data Person = Person {
      pName :: !Text
    , pAge  :: !Natural
    } deriving (Eq, Generic, Show)

-- 一旦Genericを用いてInjectのインスタンス定義
instance Inject Person

-- !?
class MyInject a where
    myInject :: InputType a

instance MyInject Person where
    myInject = injectWith $ defaultInterpretOptions {fieldModifier = T.drop 1}

> let p = Person "Hiroto" 29
> pretty $ embed myInject p
> "{ Name = "hiroto", Age = 29 }"
でもこれどう考えても冗長的なコードだし、aesonのように定義できる気がするんですよねー。。他のチャンネルでもきいてみます。
1.19.1にするならDevOpsと要相談になりますねー。
いま作業してるプロジェクトは1.15.1がデフォルトのようです。
ちょっと勘違いしてたんですが、最初のコードが無限ループするのって、autoWithの中でautoWithを呼んでるからってだけではないですかね。autoWithのデフォルト定義 autoWith options = fmap (evalState (genericAutoWith options) 1) を貼り付けてoptionの所変えてやってみては?
やってみたんですけど、今度は型エラーでコンパイルができなくなりますね。同じ名前の関数を別からインポートする必要があるのかな。。
dhallは比較的まだ新しい言語だし、当時はInjectの型クラスインスタンスは定義できなかったというのも十分ありえると思います。あったとしても相当ややこしかったのかも?(少なくともチュートリアルにはサンプルコードはありませんでした
genericAutoWith optionsState Int (Type (Rep Person a))toRep Person a -> Person になるはずなんですけど通りませんかね
目を通してくれてありがとうー。
https://gist.github.com/HirotoShioi/69a63c11e0f73afe01f9182986c052a0
色々引っ張ってきてやっとできました!
stack newで新しくプロジェクトを生成した際に予め用意した`.ghci`ファイルも自動的にそのプロジェクトに入れておく方法ってありますか?

 
:set prompt "> "
 :seti -XOverloadedStrings
 :seti -XScopedTypeVariables
 
 :set -Wall
 :set -fno-warn-type-defaults
 
 :set -DGHCI
 :set +s
 :set +t
 
 :set -package pretty-simple
 
 import Text.Pretty.Simple (pPrint)
 
 :set -interactive-print pPrint


プロジェクトを立ち上げる毎に自分のwikiから.ghciファイルをコピペするのが面倒なんです。かといってグローバルに設定すると色々問題がありそう(どのPreludeを使ってるのかわからなくなるとか)。
テンプレートに.ghciを含めておくことはできるかと思います。
stackのconfig.yamlでdefault-templateという項目を設定しておけば、デフォルトで使うテンプレートを指定できるみたいです。
https://haskell.e-bigmoon.com/stack/tips/config-yaml.html
できました!
ありがとうー!
テスト書いてて気づいたけど、Dhallって特定の文字列に対してはパースエラーを吐くっぽい?
例えばこういうのとか
"\uÞ07A\u1635"

"\uö4BCX"
Questionじゃなかった。。
\u0000 みたいなのはコードポイントの表現なので、コードポイントとしてのパースに失敗するとパースエラーになるのかなと。
\\uあああ みたいなのならいけるんでしょうね。
@keigoi has joined the channel
@eisaku.ozawa has joined the channel
@t-uchida has joined the channel
haskell-jp slack のログってどこかに公開されていたと思うのですが、url わかる方いたら教えてください:man-bowing:
doc っていうディレクトリです
ありがとうございます!:cactus:
cabal new-buildやcabal new-testで、stack buildの--pedanticオプション相当のことはできるでしょうか?
cabal new-build --ghc-options="-Werror -Wall"
でいけるだろうと思いきや、依存しているパッケージに警告があった場合までエラーになってしまうので、意図した動作にならず、悩んでおります。
--ghc-options="-Wall -Werror" とすれば良いっぽい?
と、現状のstackのpedantic がそう解釈するらしいので (参照: https://github.com/commercialhaskell/stack/blob/master/src/Stack/Options/BuildParser.hs#L30)
さすがにそれでは --ghc-options="-Werror -Wall" と結果は変わりません。。。
依存パッケージに警告があった場合までエラーになってしまいます。。。
すみません、、、-Wallしかしてないのかなと勝手に見間違いしてました><
おそらくなのですが、cabal.projectを作って、

packages: ./gtk2hs-buildtools.cabal

package gtk2hs-buildtools
  ghc-options: -Wall -Werror

allow-newer: all


みたいな感じに設定すると望みの事が出来るのでは? (例はgtk2hs-buildtoolsをghc-8.6.1でnew-buildしようとしたときの設定です)