コラッツ予想がとけたらいいな2

自分の考察を書いていきます。

Haskell

Haskell の Arrow の練習 その3(フィボナッチ)

参考記事 前回 今回は、ArrowLoop を使う。 まず Arrow 記法で書く {-# LANGUAGE Arrows #-} module ALoop2 where import Control.Arrow ( ArrowLoop(loop) ) arrowFib :: (Int, [Int]) -> ([Int], [Int]) arrowFib = proc (b, c) -> do -- d <- id -< c e <…

Haskell の Arrow の練習 その2(FizzBuzz 2)

参考記事 前回 前回の最後の代わり fb = proc x -> do e <- arr (uncurry (++)) <<< r "Fizz".(==0).(`mod`3) &&& r "Buzz".(==0).(`mod`5) -< x arr (uncurry (++)) <<< (arr (uncurry r) <<< show *** (=="")) &&& snd -< (x, e) こっちの独自路線でいこう…

Haskell の Arrow の練習(FizzBuzz)

参考記事 まず Arrow 記法で書く {-# LANGUAGE Arrows #-} module FizzBuzz where import Control.Arrow ( (<<<), Arrow(arr) ) r :: String -> Bool -> String r s b = if b then s else "" fb :: Integer -> String fb = proc x -> do a <- (==0) . (`mod`…

『8パズルは181440通り』をegison-haskellで

前記事: 8パズルは181440通り、というのをどうしてもツリーを使って計算したかった。 方法は以下。 ツリーのルートを、揃ったパターンとする。 それを、下に向かって成長させていく。追加するのは一手動かしたパターンだ。 同じパターンの所は止める。 ツリ…

プログラミングHaskell 第2版

名著と名高い「プログラミングHaskell」の第2版がラムダノートさんから出版された。 以下のラムダノートさんのサイトから購入できます。 大きな変更点は以下。 第8章 関数型パーサー ⇒ 第13章 モナドパーサー 第11章 切符番号遊び ⇒ 第9章 カウントダウン問…

すごいFizzBuzz

すごいFizzBuzzがあったので紹介します。 let (m ~> str) x = str <$ guard (x `mod` m == 0) in map (fromMaybe . show <*> 3 ~> "fizz" <> 5 ~> "buzz") 何が何だかさっぱりですね! これだけの機能を使っています。 1行目 ・ ~>内のMaybeオルタナティブ(…

foldl, foldrを元にした、蓄積変数付き、脱出可能なloop関数 その2

前記事: 参考記事: 継続モナドCont r aを使うようにした。 myLoop :: (accT -> a -> (accT -> b) -> b) -> (accT -> b) -> accT -> [a] -> b -- ↓ -- 引数の順番を変える -- ↓ myLoop :: (accT -> a -> (accT -> b) -> b) -> accT -> [a] -> (accT -> b) -…

アローの有名な例題

参考記事: リセット回路 アローの有名な例題である、リセット付フィードバック回路をやってみた。 . . アローについては、まだまだ分からない事でいっぱいだ。 . .

foldl, foldrを元にした、蓄積変数付き、脱出可能なloop関数

簡単なfoldl 簡単なfoldlの計算から。 Prelude> foldl (-) 1 [2, 3, 4] -8 Prelude> foldl (-) 1 [2, 3, 4, 5, 6] -19 問題 次の問題を考えてみる。 初期値1に対し、2, 3, 4, ... を順にマイナスしていく。 累積値が-5以下になったところで、その累積値を出…

Lensでリストのリストにset

HaskellでLensをやっている。 Lensとは、タプルやリストやレコードに対しgetterやsetterを提供するものだ。 参考記事: リストのリストに対してsetするのは、以下みたいだ。 Microsoft Windows [Version 10.0.17134.706] (c) 2018 Microsoft Corporation. Al…

8パズルは181440通り by Egison, Haskell

8パズルとは、いわゆるスライドパズルだ。15パズルが一般的だ。 これを題材にして、Egisonでツリーのプログラミングに挑戦してみた。 公式のデモでも、ツリーを扱っている。 8パズルの有効パターンは何通りあるかを計算しようと思う。 方法1 ツリーのルート…

3*3魔方陣は1種類しか存在しない by Haskell

YouTubeで3*3魔方陣は1種類しか存在しないことをやっていた。 これをプログラムでやったらどうなるだろう。 最初はEgisonでやっていたけれど、計算が終わらないのでやめた。 ソースだけ貼っておきます。 第一段階 Haskellでやることにする。 リスト[1..9]に…

Go,C++,F#,Haskellでコラッツを計算してみた

こんな感じで。 3から79999999で4x+3のみおこなう。 初期値を下回ったらそのxは終了する。 多倍長整数を使う。 並列計算する。相互作用はしない。 反例があった時のケアはしない。 出力はしたりしなかったり。 実行時間を出力する。 CPUはCOREi7-4770です。 …

マルチスレッドでマルチコア

Haskellではマルチスレッドにするだけでマルチコアで動く、との情報を得た。 さっそくやってみる。 お題は平方剰余の解を求めるプログラム。 -- module Repunit06 where import Control.Concurrent import Data.Time r19 = 1111111111111111111 ei = r19`div…

Haskellで並列計算

Haskellで並列計算してみる。 もっと難しい方法もあるみたいだけれど。ここを参考にした。 Dadakusa Log: Haskellで楽に並列処理monad-parallelというパッケージを使うのでインストールしてください。 Control.Monad.Parallelをインポートすると、 sequence…

モナド変換子の練習その2

前回のモナド変換子に、さらにIOを乗せて(敷いて?)みます。 putStrLnとかが使えるようになります。 import Control.Monad.State import Control.Monad.Trans.Maybe push :: Show a => a -> StateT [a] (MaybeT IO) () push x = do xs <- get put (x:xs) lift…

モナド変換子の練習

モナド変換子の練習です。 StateモナドにMaybeモナドを乗せてみます。内容はスタック。 import Control.Monad.State push :: a -> StateT [a] Maybe () push x = do xs <- get put (x:xs) pop :: StateT [a] Maybe a pop = do (x:xs) <- get put xs return x…

デバッグ実行するプログラム

前回のデバッグ実行するプログラムを改良してみた。 キー入力と実行関数の再帰部分をモジュール化した。 これでメインルーチンはすっきりした。 module DebugRun where import Control.Concurrent import System.IO.Unsafe data St = Run | Debug | Wait der…

HaskellでスレッドのMVar

ここを参考にして。 Haskellでマルチスレッド処理 - Qiita こうやるとこんなエラーが出る。 import Control.Concurrent main = do x <- newMVar "set01" takeMVar x >>= \y -> putStrLn y takeMVar x >>= \y -> putStrLn y Main> main set01 *** Exception: …