Skip to content

Instantly share code, notes, and snippets.

@tmcl
Created September 3, 2016 00:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tmcl/7b033ba3609084b6910742a3941997c0 to your computer and use it in GitHub Desktop.
Save tmcl/7b033ba3609084b6910742a3941997c0 to your computer and use it in GitHub Desktop.
Ordona Haskello
{-# LANGUAGE FlexibleInstances, UndecidableInstances, Rank2Types #-}
module Antaŭludo ((+), (=<<), (>>=), ($), (<$>), (<), module Antaŭludo, module Prelude.Unicode)
where
import Control.Monad.ST -- ST → SF
import Control.Monad.Loops
import System.Environment
import Data.STRef
import Prelude.Unicode -- de base-unicode-symbols
type SF = ST -- State Thread → Statusa Fadeno
type SFRef = STRef
type Ĉenan = String
type Ĉenon = String
type Enelon = IO
type Liston = []
type Listan = []
type Bul = Bool
class Show s ⇒ Montrigeblan s where
montrigu ∷ s → String
instance Show s ⇒ Montrigeblan s where
montrigu = show
class Read s ⇒ Legeblan s where
legu ∷ String → s
instance Read s ⇒ Legeblan s where
legu = read
ruliguSF ∷ ∀ a. (∀ s. SF s a) → a
ruliguSF = runST
novaSFRef ∷ ∀ a s. a → SF s (SFRef s a)
novaSFRef = newSTRef -- Ref = Reference → Referencon
leguSFRef ∷ ∀ s a. SFRef s a → SF s a
leguSFRef = readSTRef
skribuSFRef ∷ ∀ s a. SFRef s a → a → SF s ()
skribuSFRef = writeSTRef
ŝanĝuSFRef' ∷ ∀ s a. SFRef s a → (a → a) → SF s ()
ŝanĝuSFRef' = modifySTRef'
dumM_ ∷ (Monad m) ⇒ m Bul → m () → m ()
dumM_ = whileM_ -- M = Monad → Monado
videbligu ∷ Montrigeblan s ⇒ s → Enelon ()
videbligu = print
trovuOperandojn ∷ Enelon (Listan Ĉenan)
trovuOperandojn = getArgs
malsukcesu ∷ Ĉenon → a
malsukcesu = error
{-# LANGUAGE UnicodeSyntax, NoImplicitPrelude #-}
module Main
where
import Antaŭludo
fib ∷ ℤ → ℤ
fib n = ruliguSF $ do
a ← novaSFRef 0
b ← novaSFRef 1
kalkulon ← novaSFRef 1
dumM_ ((< n) <$> leguSFRef kalkulon) $ do
aMalnova ← leguSFRef a
skribuSFRef a =<< leguSFRef b
ŝanĝuSFRef' b (+ aMalnova)
ŝanĝuSFRef' kalkulon (+ 1)
leguSFRef b
ruligu ∷ Liston Ĉenan → Enelon ()
ruligu [n] = videbligu $ fib (legu n)
ruligu _ = malsukcesu "Mi deziras unu numeron n, kaj mi aldonos la n-an fibonaĉan numeron"
main ∷ Enelon ()
main = trovuOperandojn >>= ruligu
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment