haskell-jp / questions #59

alexで文字列リテラルを正規表現で定義する方法を知ってる方いたら教えてください。
$strlit = "\""([^\n\"\\]*(\\[.\n])*)*"\""

みたいに書くとparse errorと言われます(この正規表現自体はググって出てきたやつなので実際は何でも構わないです)(ダブルクォートが悪い?みたいなのですがエスケープしてもだめでした)
ちなみに文字リテラルでも同様のことがおきます
(`$charlit = \'([^\\']|\\.)\'`でparse error)
$ で始まるやつは文字集合を表します。正規表現を表すのは @ から始まるやつです。
理解しました、ありがとうございます。
それから、ダブルクォートで囲む「文字列リテラルっぽいやつ」の中ではバックスラッシュでダブルクォートをエスケープすることはできなかったはずで、文字列リテラルにマッチする正規表現は \" (ほにゃらら)* \" という感じに書けば良かったと思います。
全然気が付かなかったがよく見たら書いてあったっていうやつ
https://www.haskell.org/alex/doc/html/syntax.html#lexical
@nobv has joined the channel
@igarash1 has joined the channel
Emacs + lsp-mode + HIEを使っている方に質問です。
補完のバックエンドとして company-lsp を使用しているのですが、こちらで予約語の補完は効いていますか?
現在、モジュールや関数の補完は効いているのですが、 import など予約語の補完が効かず、スニペットにがんばってもらっている状態です。
他のエディタ + HIEを使用している方も、ちゃんと予約語まで補完されているでしょうか?
こんばんは、ご無沙汰です。最近 GHCJS をビルドするために Nix を使い始めたのですが、もし詳しい方がいたらお力添えください。

Miso によるアプリを Nix でビルドしようとしていて、リンク先の README.md () にあるサンプル (`miso-0.12.0.0`) はビルドできるのですが、バージョンを最新の 0.21.2.0 まで上げようとしたところエラーになりました。cabal から見えていないようです。

Configuring app-0.2.0.0...
Setup: At least the following dependencies are missing:
miso -any
builder for '/nix/store/c7b2w4d0p1wnnjl3ajayarc12y4jvdgp-app-0.2.0.0.drv' failed with exit code 1
error: build of '/nix/store/c7b2w4d0p1wnnjl3ajayarc12y4jvdgp-app-0.2.0.0.drv' failed


ビルドしようとしている nix expression は以下です。pinned nixpkgs miso-0.12.0.0 で成功した際の app のビルドおよび miso-0.21.2.0 ライブラリ自身のビルドと同じで、`miso` の revsha256 は miso 最新 release から nix-prefetch-url --unpacked で取ってきています。

$ cat default.nix
{ pkgs ? import ((import <nixpkgs> {}).fetchFromGitHub {
    owner = "NixOS";
    repo = "nixpkgs";
    rev = "a0aeb23";
    sha256 = "04dgg0f2839c1kvlhc45hcksmjzr8a22q1bgfnrx71935ilxl33d";
  }){}
}:
let
  result = import (pkgs.fetchFromGitHub {
    owner = "dmjio";
    repo = "miso";
    sha256 = "07k1rlvl9g027fp2khl9kiwla4rcn9sv8v2dzm0rzf149aal93vn";
    rev = "bb2be3264ff3c6aa3b18e471d7cf04296024059b";
  }) {};
in pkgs.haskell.packages.ghcjs.callPackage ./app.nix {
  miso = result.miso-ghcjs;
}

$ cat app.nix
{ mkDerivation, base, miso, stdenv }:
mkDerivation {
  pname = "app";
  version = "0.2.0.0";
  src = ./.;
  isLibrary = false;
  isExecutable = true;
  executableHaskellDepends = [ base miso ];
  description = "First miso app";
  license = stdenv.lib.licenses.bsd3;
}
Neovim + LanguageClientでHIEを使っていますが、予約語は補完されなかったと思います。
vscode + vscode-hie-server ですが同じく補完されていません.(プラグマの括弧{-# #-}とか補完効いてくれるとうれしいですね(中身は補完されますが))
やはりそうなんですね...
最初エディタ側の問題かと思っていましたが、HIE側で機能追加されるといいですね
命令型プログラミング (Python) と関数型プログラミング (Haskell) の比較を行える、実践的なサンプルコード (50行程度) を考えているのですが、何か良い題材など皆さま思いつきますでしょうか?? :thinking_face:

map , filter , foldr , Maybe , Either などに言及するものは多いですが、もう少し行数を稼いだものを提示したいなと
すでに書かれている例はぱっと思いつきませんが、例えば https://qiita.com/drken/items/23a4f604fa3f505dd5ad とか https://qiita.com/kazukazukazukazu/items/e5db00a3aefb1f5ed72f に書いてある例をHasekllで書き換えてみるとか面白いかも知れませんね。
@tak. has joined the channel
再帰を活用する例は、たしかにらしくていいかも知れないですね、ありがとうございます :slightly_smiling_face:
比較の目的というのはどのへんにありますか?
もし比較の目的が、PythonからHaskell への橋渡しであるなら、この本はいかがでしょうか。後ろのほうに丁度50行ほどのサンプルがあります。手続き型の流れの中で、自然な形で再帰やパターンマッチも導入されています。

https://doujin.kakkun61.com/procedural-haskell
色々試した結果、ビルド出来ました。
おっしゃる通り、橋渡しが目的です :slightly_smiling_face:

こちらの同人誌、非常に参考になりそうで良いですね、ありがとうございます!
@sachiotomita has joined the channel
@ has joined the channel
wai+warpでWebアプリケーションを作っていて Application 型に Reader モナドで設定をもたせたいのですが ReaderT での変換の仕方がイマイチつかめません。どんなふうにすればよいでしょうか
Scottyのソース見ててなんとなくわかってきたんですが、自前のモナドを定義してそれを Application に変換する関数あればよさそう?
とある型クラスのメソッドを呼んだとき、どのインスタンスに解決されたかを可視化するにはどうするのが一番お手軽でしょうか?
具体的には、現在、 Foldablenull メソッドを意図しない型に対して適用してしまったことによるバグに遭遇したため、同じミスをやらかしている箇所がないか探したい、というのが主な目的です。
なんだろう、Type Hole でしょうか? :thinking_face:
> ((<>) :: _) "a" "b"

<interactive>:7:10: error:
    • Found type wildcard ‘_’ standing for ‘[Char] -> [Char] -> [Char]’
      To use the inferred type, enable PartialTypeSignatures
ああー、いや、プロジェクト内のソースコード全体から探したいんですよねぇ。
今の私のプロジェクトの話を単純化すると、
type Foo = [Int]

を、
type Foo = ([Int], Bool)

みたいな型に変えた結果、 Foo に対して意図せず null を適用していてもわからない(コンパイルエラーにならない)、という状況なので...
ああー理解しました…
Coreをダンプしてテキスト検索…?
やっぱそれっすかねー :muscle: :sweat_smile:
期待する型をTypeApplicationsで書いてしまうとか…?(使い方間違ってたらすみません)
残念ながら、問題の「間違って null などを意図しない型に適用してしまっている」箇所がそもそもどこかわからない(それを知りたい)という状況なのでその方法は使えません... :disappointed:
ただ、それを聞いて気づいたんですが、 https://haskell.e-bigmoon.com/posts/2018/05-23-extended-prelude.html のテクニックでカスタムPreludeを作り、 nulllength の定義を書き換えるというのは有効ですね :bulb:
Prelude にある型クラスじゃないと使いにくいテクニックではありますが。
nullをFoldableからリストに限定するという感じですかね?
そう、リストに限定したバージョンを作ってそれをカスタムPreludeからexportする、という感じで。Prelude以外のモジュールでも、cabalファイルで工夫すれば出来そうな気がします。
Coreのダンプと果たしてどっちが楽かな...
@maguhiro has joined the channel
@edochan5 has joined the channel
yesod-form-bootstrap4というOSSを書いているのですが,bootstrap 4ではradioとcheckboxのformは別形式なので
-- | 入力されたフィールドがcheck形式である必要があるか判定する
inputTypeBoolOrCheckBox :: Monad m => FieldView site -> m Bool

という関数を書こうとして1日が過ぎました.
Htmlを展開して内容を見てやろうとするとどうしてもMonadHandlerになってしまう…しかし展開しないと判別がつかない…tooltipに文字列入れて運用でカバーするしか無いのかなあ…
ついでにform-check-inputをつける方法もわからないしなんかもう絶望的ですね
こんにちは。いつも初歩的な質問ばかりで恐縮ですが、`Traversable`のインスタンスに対して、 Data.Listの`take`, drop に相当する関数をご存知でしょうか?
Data.Csv.Streamパッケージを使い、数百MBのCSVを読んで、100件毎にデータベースに書き込む、といった処理を作っています。
リストであれば、↓のようにできるのではないかと思い、これを`Traversable`で置き換えようとしております。
do 
  xs <- parseCsv
  saveLines xs
where
  saveLines xs = saveToDb (take 100 xs) >> saveLines (drop 100 xs)
Data.Listtake, drop に相当する関数」はないはずです。
Traversable はあくまでも全体をなめることができるだけなので。
mono-traversableパッケージの IsSequence 型クラスのインスタンスであればできるみたいですが... http://hackage.haskell.org/package/mono-traversable-1.0.11.0/docs/Data-Sequences.html#t:IsSequence
であれば、自前で作るか、いったん(遅延IOの力を信じて)リストに変換しちゃうか、ですね。。。
take したいのはそのとおりです。
あるいは、 http://hackage.haskell.org/package/cassava-conduit を経由すればConduitのtakeやdropが使えるのではないかと
情報ありがとうございます。このパッケージだとヘッダ付きのCSVは扱えないようなので残念!

Streaming to CSV is not 100% complete at this stage, and doesn’t support encoding to CSV with a header yet
いったん(遅延IOの力を信じて)リストに変換しちゃう

これが正解でした。ありがとうございました!

toList しただけですが、意図どおり、メモリ消費を抑えつつ巨大CSVファイルの読み込み&パース&DB書き込みができました。