Haskell 5

宋建本
2023-12-01

i定义一个自然数类型
思路: –0是自然数
–if n 是自然数,n+1是自然数
data Nat = Zero | Suc Nat deriving Show —Suc 是后继的意思

nat2Int :: Nat -> Int —Nat类型转换成Int类型
nat2Int Zero = 0
nat2Int (Suc n) = 1 + nat2Int n —这里的n是Nat 类型

—Show Zero感觉不好,写成Show 阿拉伯数字的形式
data Nat = Zero | Suc Nat
instance Show Nat where —-表示show这个instance,show首字母大写,但函数本身是小写
show n = show (nat2Int n)

加show前

Nat Zero
报错

加show后

Nat Zero
0

–写一个Nat类型的加法
add :: Nat -> Nat -> Nat
add Zero n = n
add (Suc m) n = Suc (add m n ) —–递归,直至m为Zero,此时 add Zero n = n ,再多重Suc

—描述2 , 2+3 , 2*3 , 2*(3+4)
思路 : —整数是一个表达式
—因为复杂表达式又简单的组成,if e1 and e2 是表达式, e1 + e2 或e1 * e2 是表达式

data Exp = Val Int | Add Exp Exp | Mul Exp Exp deriving Show
—Val Int 表示把整数转换成表达式

计算并得出整数结果
eval :: Exp -> Int
eval ( Val n ) = n
eval ( Add e1 e2 ) = ( eval e1 ) + ( eval e2 )
eval ( Mul e1 e2 ) = ( eval e1 ) * ( eval e2 )

–写一个Show,把输入Add,Mul替换成数字表达式
data Exp = Val Int | Add Exp Exp | Mul Exp Exp
instance Show Exp where
show e = formatExp e

formatExp :: Exp -> String
formatExp ( Val n ) = show n
formatExp ( Add e1 e2 ) = formatExp e1 ++ “+”++ formatExp e2
formatExp ( Mul e1 e2 ) = formatExp e1 ++ “*” ++ formatExp e2 —-不完整,没有括号表示运算顺序

–添加变量元素
data Exp = Var String | Val Int | Add Exp Exp | Mul Exp Exp deriving Show
—Var String把用字符串方式表示的变量转换成表达式

–修改Show 函数
添加 formatExp ( Var x ) = x

–修改计算
type Subst = [(String , Int)]
eval :: Exp -> Subst -> Int —–Subst指表达式中每个变量对应替换的数
eval ( Val n) _ = n
eval ( Var x ) subs = head [k | ( y, k ) <- subs , y == x]
eval ( Add e1 e2 ) subs = (eval e1 subs ) + (eval e2 subs )
eval ( Mul e1 e2 ) subs = (eval e1 subs ) * (eval e2 subs )
subs = [ ( “x” , 1 ) , ( “y” , 2 )] –定义x,y的值

show : 把任意类型转换成字符串
read : 把字符串转换成任意类型 ( 因此需要加上想转换的类型 )

read “2” :: Int
2
read “2” ::Float
2.0

“1234” = [‘1’,’2’,’3’,’4’],char型直接加[],就变成Sting

定义变量 ,如:

 p :: Prop
 p =  And (Var 'A') (Not (Var 'A'))
 类似资料:

相关阅读

相关文章

相关问答