haskell-jp / beginners #16

質問連投失礼します.上のような関数を定義したのですが,このままでは無限リストになってしまいます.すでに登場したインデックスの呼び出しが再び出てきたら再帰を停止するという条件で,基底状態を定義することはできるのでしょうか?
要は以下のような値を返してほしいのです.
よろしくおねがいします.
@basashi このままではちょっと難しいかも。登場したインデックスを持てばいいと思います。
route :: [Int] -> Int -> [Int]
route xs = go []
  where go res i | i `elem` res = reverse res
                 | otherwise    = go (i:res) (xs!!i)
(なお、これだと O(n^2) かかりそうなので、高速化する場合は Array / Vector を使ってあげたほうがいいですね)
@juxtapose
なるほど。
再帰の結果を引数として持つ。ただ、その引数を隠すために再帰させる関数をラップする。
という理解でいいでしょうか?
@TH 計算量を考慮すると、一旦無限リストにしておいて、他の関数でtakeのように一部切り取るという使い方が推奨されるのでしょうか?
計算量を考慮する場合、第一引数(それぞれの頂点からの行き先)の配列をランダムアクセスできるように Array にしたほうがいいのと、すでに到達した場所を保存するための Array を保持したほうがいいということです。
現在の仕組みだと、それぞれの頂点に到達するたびに、(最悪で)列全体をなめる必要があるのです。
ただし、 n = 10^3 程度なら現実的な時間で終わると言えると思います。
なるほど
ただ、まだ勉強がArrayまでたどり着いていなくて
計算量を減らすにはArrayが推奨されるのは納得しました。一方でリストを使ってなんとか計算量を抑えたい時、一旦無限リストにして他の関数で切り取るという流れにすることでjuxtaposeさんの提示してくださったコードよりも計算量を減らすことは可能ですか?
いえ、一旦無限リストを作ってから切り取ることと、途中で再帰しなくなる条件を関数自身に書くことは、遅延評価の Haskell においては基本的に同等だと思います。
@ has joined the channel
GUIをやろうと思いhaskell-giを試していますが、HelloWorld以上のことができません。具体的にはテキストボックスが使えていません。Gtk.EntryやGtk.TextViewでテキストボックスを設置することはできましたが、実際に入力された値を取り出すことができません。何か参考になるようなサイトをご存知でしたらご教示頂きたく。公式サイトを見ましたが構文だけで実際にどうコーディングすればいいのかわかりませんでした。公式サイトのexamplesも見てみましたが、参考になりそうなコードはありませんでした(見つけられませんでした)。teratailで質問しましたが、まだ出来るようになっていません。
... Replies ...
@TH さん
返信遅れました。遅延評価ですか、なるほど
勉強になりました。ありがとうございます
@Kei has joined the channel
@T C has joined the channel
Reminder: beginnersチャンネルは、新しい人がスムーズにHaskellに慣れるための質問を歓迎するチャンネルです。
Haskell-Beginners ML や IRCの#haskell-beginners  や RedditのMonthly Hask Anythingのような位置づけを意図しています。

beginnersチャンネルでの回答側は、以下の左側のような応答を厳禁とする運用です。
• それはくだらない質問だ → くだらない質問など無い
• その質問は以前にもあった → 質問者はそんなこと知らない
• Google検索せよ → 検索できないから質問している

beginnersチャンネルでは、例えば以下のレベルの質問から歓迎します。
: とは何のことですか。
• タプルとは何ですか。
@kyoheiu has joined the channel
@nseki has joined the channel
はじめまして。
Haskell学習のため [Advent of Code 2020]() をちまちま解いているところなのですが、解答できたけれどコードが汚くなってしまうものがあります。
https://adventofcode.com/2020/day/8 8日めのこの問題、こういうコードになりました。
https://github.com/kyoheiu/aoc2020-haskell/blob/master/day08/app/Main.hs

そもそも最適なアプローチはこれではないということかもしれませんが、それはいったんおいて、このアプローチでもっとHaskellっぽいコードにリファクタリングするにはどういう考え方があるでしょうか?
とりあえず引数の数が多いのが嫌な感じなのですが…。
... Replies ...
@thanai has joined the channel
@hakamatao has joined the channel
@ has joined the channel
@MegaClaypool has joined the channel
漸化式として無限等差数列を定義するにはどうしたら良いでしょうか?
ネットで検索した分には次のようなコードを見つけました.
step=3:(map (+ 4) step)

fib = 0 : 1 : zipWith (+) fib (tail fib)

これらは無限等差数列は実現できているのですが,漸化式としての特徴がコードを見てもわかりにくいように感じます.
... Replies ...
@yakami has joined the channel
@sanao has joined the channel
@matsu has joined the channel
takumi_matsuura
@takumi_matsuura has joined the channel
@eliza0x has joined the channel
@en30 has joined the channel
@yuyawk has joined the channel
@Parker Liu has joined the channel
@gest N has joined the channel
初めまして
ダウンロードしたパッケージ(System.Random)をghciにインポートしたいのですが
インポートするときに
Prelude> :l Main

Main.hs:seven:8:
  Could not find module ‘Control.Monad.State.Strict’
  Perhaps you meant
   Control.Monad.ST.Strict (from base-4.8.2.0)
   Control.Monad.Trans.State.Strict (from transformers-0.4.2.0@trans_GZTjP9K5WFq01xC9BAGQpF)
  Use -v to see a list of the files searched for.

Main.hs:13:8:
  Could not find module ‘Gauge.Main’
  Use -v to see a list of the files searched for.

Main.hs:15:8:
  Could not find module ‘System.Random.SplitMix’
  Use -v to see a list of the files searched for.

Main.hs:17:8:
  Could not find module ‘System.Random.Stateful’
  Use -v to see a list of the files searched for.
Failed, modules loaded: none.
というエラーが出てしまいます
これはどのように解決したら良いでしょうか
また、やり方が間違っていたらやり方を教えていただけると幸いです
... Replies ...
@Elfi Automata has joined the channel
質問です。
Haskellのフレームワークって何種類かあるようですが、最初に触れるなら今どきどれがオススメでしょうか?なんとなくYesodがいいのかなと思ってますが……
... Replies ...
はじめまして。関連して質問です。
最近フルスタックwebフレームワークとしてIHPというものも出てきているみたいですが、もし触ったことがある方がいれば、普段Haskellを書いている方からした印象はどうなのか伺いたいです。
すみません 解決しました
@LEG END has joined the channel
@fuji has joined the channel
arrowの書き方で main = getLine
= print と同じ関数を書くにはどうしたらいいでしょうか?
... Replies ...
すみません
arrowをproc?記法を使わないで書くとKleisli const が大量に出てきてしまうのですがこれは回避する方法があるのでしょうか?
... Replies ...
Yoshikuni Kato
@Yoshikuni Kato has joined the channel
Windows10, GHC8.10.4を使っています。
hSetBuffering stdin NoBufferingをしてgetCharでキーの入力を即座に読もうとしたのですが、エンターキーを押すまで入力が読み取られません
解決法はありますでしょうか
... Replies ...
1年前ぐらいから、lens恐怖症を克服してlensを使うようになりました。
makeFields でプレフィクス無しで参照できるのを便利に使っています。
しかし、取得時が楽になった分、これまで我慢していた構築時のプレフィクスも消せないかなと思えてしまいます。
添付したスニペットみたいに、構築時にもプレフィクスを取り除きたいです。

最近大量のデータ型をサンプル生成しなければいけなくて、強くそう思うようになりました。
とりあえずは雑なデータを入れて、変更したい場所だけをlensのSetterで変更するようにしていますが、雑に入れるわけにもいかないデータを構築するときや、そもそも構築の原点ではやはりプレフィクスを一々入れる必要があるので面倒です。
Stackageに載ってないGHCは流石に実運用するのがライブラリの構築など面倒なので、`NoFieldSelectors` を使ってプレフィクス自体を消すわけにもいきません。
lensなどを使ってプレフィクス無しで構築する方法は存在しますか?
... Replies ...
モナド変換子について質問です。
モナド変換子は圏論的にはどのように理解すればよいでしょうか?
... Replies ...