Haskell – DECODE https://decode.red/blog data decode, decoder or decoded ... design of code Mon, 15 Dec 2025 06:15:00 +0000 ja hourly 1 https://wordpress.org/?v=4.7.29 Trump / Haskell ../../../20161123633/ Tue, 22 Nov 2016 15:13:53 +0000 ../../../?p=633 今話題のトランプ(?)をHaskellで操作してみました。Haskellとかレアな言語は使わないと忘れてしまうので、思いついた時に活用してみる意味も。

参考 : http://tune.hateblo.jp/entry/2015/05/12/023112
「Haskellでポーカーを作ろう〜第一回 リストのシャッフルとカードの定義〜」

環境 : Haskel for Mac ver 1.3.0 / macOS Sierra ver 10.12 (Macが修理から戻って新OSに)
haskell01

この中で、一番興味深いのが32行目のリスト内包表記です。
このような集合を表現することで、トランプを操作できます。
これを応用して音楽などを表現するのも、面白そうです。

import System.Random.Shuffle
import Data.List

data Suit = Spd | Hrt | Clb | Dia
  deriving (Show, Read, Eq, Ord, Enum)
  
data Card = Card Suit Int
  deriving (Eq, Ord)
  
showCardNumber :: Int -> String
showCardNumber 13 = "K"
showCardNumber 12 = "Q"
showCardNumber 11 = "J"
showCardNumber 10 = "X"
showCardNumber 9 = "9"
showCardNumber 8 = "8"
showCardNumber 7 = "7"
showCardNumber 6 = "6"
showCardNumber 5 = "5"
showCardNumber 4 = "4"
showCardNumber 3 = "3"
showCardNumber 2 = "2"
showCardNumber 1 = "A"

instance Show Card where
  show (Card Spd i) = "S" ++ showCardNumber i
  show (Card Hrt i) = "H" ++ showCardNumber i
  show (Card Clb i) = "C" ++ showCardNumber i
  show (Card Dia i) = "D" ++ showCardNumber i
  
allcd :: [Card]
allcd = [ Card suit num | suit <- [Spd ..], num <- [1..13] ]

cardSuit :: Card -> Suit
cardSuit (Card s _) = s

cardNumber :: Card -> Int
cardNumber (Card _ n) = n

haskell02

シャッフルした結果や、並び替え、比較などいろいろ試してみました。
関数型言語の便利な一面を体験できる例だと思います。(素晴らしい参考サイトの記事です)

しかしながら、トランプ大統領の選挙結果を大きく外したデータサイエンティストの方々は、どんなことを今考えているのでしょうか。何十年ぶりとか過去に例がないことなど、やはり予測は難しいのでしょう。

]]>
Langlands Program (2) ../../../20160330550/ Wed, 30 Mar 2016 13:58:13 +0000 ../../../?p=550 関数型言語Haskellで、OctaveとSwiftでテストして前回と同様のことをしてみました。

環境: GHC 7.6.3, Haskell for Mac 1.0.3 / Mac 10.10.5

import Control.Monad

lsmul :: [Int] -> [Int] ->[[Int]]
lsmul [] ys = []
lsmul xs ys = [(map (\n -> n * (head xs)) ys)] ++ (lsmul (tail xs) ys)

poly xs ys = foldl (\x -> zipWith (+) x) (take len $ repeat 0) (addz (lsmul xs ys))
  where len = length xs + length ys - 1
        addz ns = map (\(n, xs) -> (take n $ repeat 0) ++ xs ++ (take (len-n) $ repeat 0)) (zip [0..] ns)

loopf n ls = when (n > 0) $ do
                let xs = foldl (\x -> poly x) [1] [ls, insz(n-1), insz(n-1), insz(n*11-1), insz(n*11-1)]
                print xs
                loopf (n-1) xs

insz n = [-1] ++ (take n $ repeat 0) ++ [1]

main = do
       loopf 13 [1]

ghc poly.hs

でコンパイル。
係数の計算は実行速度が遅かったので、13までにしました。
このコードだとOctaveの方が速い。

poly01
解の個数はHaskellっぽい手法でシンプルに解を求められます。

./poly

の実行結果
poly02
素数3,5,7,9,13まで、係数と解の個数が一致しているのが確認できました。

]]>
Haskell for Mac ../../../20151017445/ Sat, 17 Oct 2015 07:08:34 +0000 ../../../?p=445 関数型言語Haskellに、XcodeのPlaygroundのような開発環境があるということで、すぐに購入しました。リアルタイムにコンパイル・実行し、一行ごとに結果を表示できるため、試行錯誤がしやすくなりました。難易度が高い言語なので、とても助かります。
Haskellは、データコンバートのツールを作ったりしていますが、とても好奇心をくすぐられる言語です。
今回、付属しているサンプルにグラフを表示するものがあったので、この部分を使ってファイルから入力したデータをプロットするプログラムを作ってみました。
これでますますPlaygroundっぽく使えることになります。
haskell_sample

import Graphics.SpriteKit

env <- chartEnv
txt <- readFile "test.txt"

print txt
let l = lines txt
print l
let w = map words l
print w

let atoi a = read a :: Int
let idx i a = a !! i

let ns = map (map atoi) w
let x = map (idx 0) ns
x
let y = map (idx 1) ns
y

cRender env chart (zip x y)

入力するテキストファイルは、プロジェクトフォルダの中に置きます。一行にスペース区切りで二つの数値を一組として、記述します。
haskell_chart01
グラフをクリックすると拡大します。
haskell_chart02
こうやって使ってみると、Swiftに似ているとあらためて感じます。

haskell

]]>