first commit
This commit is contained in:
commit
5a157d66b0
43
README.md
Normal file
43
README.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# I'm so sorry
|
||||||
|
|
||||||
|
Hoon101's Week 2 Assignment in Haskell
|
||||||
|
|
||||||
|
> Create a gate that takes a noun, checks if its a cell, and if not, checks if the atom is odd or even
|
||||||
|
|
||||||
|
## Running
|
||||||
|
|
||||||
|
in `ghci`, load the file:
|
||||||
|
|
||||||
|
```
|
||||||
|
:load week2.hs
|
||||||
|
```
|
||||||
|
|
||||||
|
you can then run the program using the form
|
||||||
|
|
||||||
|
`:t solution (nil :: X)`
|
||||||
|
|
||||||
|
where `X` is either an atom or a cell, using the following syntax:
|
||||||
|
|
||||||
|
`Atom`: Using Church Encoding with `(S n)` and `Z`, ie `(S (S (S Z)))` is the atom `3`
|
||||||
|
|
||||||
|
`Cell`: Using `Cons x xs` and `Nil`, ie `(Cons (S Z) (Cons Z Z))` is the cell `[1 [0 0]]`
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```
|
||||||
|
*Main> :load week2.hs
|
||||||
|
[1 of 1] Compiling Main ( week2.hs, interpreted )
|
||||||
|
Ok, modules loaded: Main.
|
||||||
|
|
||||||
|
*Main> :t solution (nil :: (S (S (S (S Z)))))
|
||||||
|
solution (nil :: (S (S (S (S Z)))))
|
||||||
|
:: IsEvenAtom
|
||||||
|
|
||||||
|
*Main> :t solution (nil :: (S (S (S (S (S Z))))))
|
||||||
|
solution (nil :: (S (S (S (S (S Z))))))
|
||||||
|
:: IsOddAtom
|
||||||
|
|
||||||
|
*Main> :t solution (nil :: (Cons (Cons (S Z) (S (S Z))) (Cons (S (S (S Z))) (S (S (S (S Z)))))))
|
||||||
|
solution (nil :: (Cons (Cons (S Z) (S (S Z))) (Cons (S (S (S Z))) (S (S (S (S Z)))))))
|
||||||
|
:: IsCell
|
||||||
|
```
|
61
week2.hs
Normal file
61
week2.hs
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{-# OPTIONS_GHC -fno-warn-missing-methods #-}
|
||||||
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
{-# LANGUAGE FunctionalDependencies #-}
|
||||||
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
|
{-# LANGUAGE UndecidableInstances #-}
|
||||||
|
|
||||||
|
nil = undefined
|
||||||
|
|
||||||
|
data True
|
||||||
|
data False
|
||||||
|
|
||||||
|
data S n
|
||||||
|
data Z
|
||||||
|
|
||||||
|
data Nil
|
||||||
|
data Cons h t
|
||||||
|
|
||||||
|
data IsCell
|
||||||
|
data IsOddAtom
|
||||||
|
data IsEvenAtom
|
||||||
|
|
||||||
|
class Not t b | t -> b
|
||||||
|
instance Not True False
|
||||||
|
instance Not False True
|
||||||
|
|
||||||
|
class And a b r | a b -> r
|
||||||
|
instance And True True True
|
||||||
|
instance And True False False
|
||||||
|
instance And False True False
|
||||||
|
instance And False False False
|
||||||
|
|
||||||
|
class If c t f r | c t f -> r
|
||||||
|
instance If True t f t
|
||||||
|
instance If False t f f
|
||||||
|
|
||||||
|
class IsEven a b | a -> b
|
||||||
|
instance IsEven Z True
|
||||||
|
instance IsEven (S Z) False
|
||||||
|
instance (IsEven n r)
|
||||||
|
=> IsEven (S (S n)) r
|
||||||
|
instance IsEven (Cons xs x) False
|
||||||
|
|
||||||
|
class Wutpam t b | t -> b
|
||||||
|
instance Wutpam Z True
|
||||||
|
instance Wutpam (S n) True
|
||||||
|
instance Wutpam Nil False
|
||||||
|
instance Wutpam (Cons x xs) False
|
||||||
|
|
||||||
|
class Wutket t b | t -> b
|
||||||
|
instance (Wutpam t b, Not b r)
|
||||||
|
=> Wutket t r
|
||||||
|
|
||||||
|
class Solution n r | n -> r
|
||||||
|
where solution :: n -> r
|
||||||
|
instance ( Wutket n c
|
||||||
|
, Not c a
|
||||||
|
, IsEven n m
|
||||||
|
, If m IsEvenAtom IsOddAtom e
|
||||||
|
, If c IsCell e o
|
||||||
|
)
|
||||||
|
=> Solution n o where solution = nil
|
Loading…
Reference in New Issue
Block a user