haskell-jp / questions #34

@mic.ms.co has joined the channel
@kitada.kosuke has joined the channel
@yethan.goes.asna has joined the channel
@oyasumi60 has joined the channel
@fmr23s has joined the channel
@ghbjy6 has joined the channel
@skazufumi.a02525 has joined the channel
@cgeb has joined the channel
func f [1, 2, 3] [False, True] = [[f 1 False, f 1 True], [f 2 False, f 2 True], [f 3 False, f 3 True]] みたいな関数 (`f <$> a <*> b` の平らにしないバージョン) を簡単に書く方法ってあります? 今は fmap の繰り返しで書いてます
あ、自己解決したかも。質問する前に思いつきたかった func f a b = [ [ f as bs | as <- a ] | bs <- b ]
func f a b = [ [ f as bs | bs <- b ] | as <- a ] でした
as と a は逆です。なんか頭がバグってた
func f a = map (\y -> map (\x -> f x y) a) とかまでは行けましたがそれから先はうーん。
はじめまして。packagename.cabalのないpackageを依存packageとして使いたい場合、stack.yamlに上手い具合に設定して取ってきたpackageにpackage.yamlを追加するようなことはできないでしょうか。

具体的には研究である著者のライブラリを依存パッケージとして利用する際package.yamlはもちろん、packagename.cabalもなかったため、自分で書き加え自分のリポジトリに追加しました。これだと研究成果を公開する際に問題が生じそうなので、gitで管理するのは依存packageのyamlだけにし、利用者がbuildするときpackage本体は自動でとってくるようにしたいと考えております。

よろしくおねがいします
そのライブラリーがgitリポジトリーとして公開されているなら、git submoduleで自分のリポジトリーに追加して、
自分のリポジトリーでは

... 省略 ...
library
  hs-source-dirs: path/to/submodule
... 省略 ...


と書いたcabalファイルで対象のライブラリーが入ったパスを参照するようにすれば、対象のライブラリーをcabalパッケージとして扱えるようになるはずなので、あとはstack.yamlで extra-deps にそのcabalファイルが入ったパスを書けば良いのではないかと。
@koyama has joined the channel
(僕はやったことないけど)
stack なら stack.yaml の packages: に追加すればいいんじゃないかな
https://docs.haskellstack.org/en/stable/yaml_configuration/#packages-and-extra-deps
packages:
- .
- path/to/package
package本体は自動でとってくるようにしたい

というかその package 本体はどこかに公開されてる?GitHubとか?
最初 packages: に追加する方法を考えたんですが、その方法だと指定したディレクトリーの中にcabalファイルがないので結局ダメなんじゃないかと思いまして…:thinking_face:
traverse f [1,2,3] <$> [False, True]はどうですか?
自分で足せばいいかなと思ってた
cabal ファイルか package.yaml
利用したいpackageは https://www.mathstat.dal.ca/~selinger/quipper/oldreleases.html にあります.一応今はこれに.cabalを追加してmypackageに含めてstack.yamlのpackage:に追加しています.extra-deps: https://www.mathstat.dal.ca/~selinger/quipper/downloads/quipper-0.8.tgz のように追加したらquipperにcabalがないと言われたので.
(extra-depsにこのように書けばstack build時に自動でとってきてくれるという認識です)
Hackage にあるけど。。。?
http://hackage.haskell.org/package/quipper
これでいいなら
extra-deps:
- quipper-0.8.2

を stack.yaml に足せば動作するはず
hackageの方は関数が足りず、著者のページから持ってくる必要があります...むしろ足りない関数を足したものを自分でhackageに登録すればよかったり...
quipper に独自拡張を入れたい的な?
ライセンス上問題がなければ追加したものを自分でhackageにアップロードしちゃってもいいんじゃないっすかね。
COPYRIGHTファイルを見た限り3条項BSDかな?
もちろんより丁寧にやるなら作者に聞いた方がいいでしょうけども。
更新履歴をみる限り、hackage も著者のサイトのも差はないきがするけど
著者の方にはQuipperLibの中にSimulationというモジュールがあると思います
ありがとうございます、ライセンスについてよく調べてみます
ちなみに、やりたいことはquipperの関数をある型レベル計算を行うモジュールで包む、という感じです
igrep さんのいう通り bsd3ライセンスだし、ライセンスのファイルと、unofficial fork であることを足して GitHub にあげちゃってもいい気がする
あとは適当に cabal ファイルか stack の設定を足して
igrepさん,matsubara0507さんありがとうございます.その方針で進めてみようと思います.
@zokutyou2 has joined the channel
[extensible攻略WikiのDotenvレシピ]()を見ていて疑問点が3つあります
Data.Extensible.Util の存在
fromHashMapOfstrings はどのライブラリから?
• 大文字のフィールドに(`itemAssoc`を使わず)ラベルでアクセスする方法
よろしくお願いします
Data.Extensible.Utilmaster にマージされていないモジュールなので fromHashMapOf ブランチを参照すると定義されています。(たぶん、そのうちマージされると思います)
https://github.com/fumieval/extensible/tree/fromHashMapOf
大文字のフィールドに(`itemAssoc`を使わず)ラベルでアクセスする方法

OverloadedLabels のページにも少し書いてある通りです。現状はアクセスする方法は無いと思います。
https://wiki.hask.moe/OverloadedLabels

ただ、以下の proposal が受理されたので、近いうち解決しそうな気がします。
Unrestricted OverloadedLabels #170
https://github.com/ghc-proposals/ghc-proposals/pull/170
ありがとうございます!
[] が Traversable で (->) が Applicative であることを利用するんですね。すごい……。初めに考えたのは func f as bs = fmap (flip (\b -> fmap (\f -> f b)) (fmap f as)) bs です
より一般的な型である (Functor f, Functor g) => (a -> b -> c) -> f a -> g b -> g (f c) はこう書くしかないっぽい?
無駄なところを削った func f as bs = fmap (\b -> fmap ($ b) (fmap f as)) bs の方がいいですね
@tatsuhiro.9699 has joined the channel
@kazy.crazycloud has joined the channel
自分は改造したやつを使う時は

extra-deps:
  - ../hakyll


のように別ディレクトリを参照するようにstack.yamlに書いてますね
私が知る限りできないと思っているんですが、Haskellで、moduleをimportしただけで、そのmoduleに含まれている識別子を参照することなく、副作用を起こす(つまり何らかの形でunsafePerformIOを実行する)ことってできるんでしょうか?
試しに :point_down: みたいなコードを書いてみたんですが、やっぱりトップレベルでBang patternは使えないと怒られました。

{-# LANGUAGE BangPatterns #-}

module Mod where

import Debug.Trace

hoge :: ()
!hoge = trace "hoge" ()
... あっ、Template Haskellがあるじゃないか... :cold_sweat:
すみません、Template Haskellを使えば普通にできましたね... :sweat_drops: