《Haskell趣学指南》读书笔记(3):函数的语法

这篇博客探讨了Haskell编程语言中独特的函数语法,包括模式匹配的概念,如列表的表示方式x:xs,以及as模式、Guards分支、where关键字和let关键字的用法。还介绍了case关键字作为模式匹配的基础,以及它与其它语法结构的灵活性比较。
摘要由CSDN通过智能技术生成

本章着手于Haskell独特的语法结构

模式匹配

lucky  :: (Integral a)  => a -> String

lucky 7 = "Lucky Number"

lucky x = "sorry"


调用lucky时。模式会从上到下进行依次模式匹配,匹配成功则自动运行该句话,匹配失败则自动转到下一句模式匹配

--阶乘 (模式匹配中也可以使用递归)
factorial :: (Integral a) => a -> a
factorial 0 = 1
factorial n = n * factorial(n - 1)

 -- 取元组的指定元素
 first ::(a,b,c) -> a
 first (x ,_,_) = x
 
 second ::(a,b,c) - > b
 second (_,y ,_) = y
 
 third :: (a,b,c) ->c
 third (_,_,z) = z

|| list 本身也是一个模式匹配,[1,2,3 ] 其实本质上是1:2:3:[ ]
因此list可以表示为 x : xs这种形式(当然使用x:y:xs 就可以绑定list前两个元素)
[x] == (x:[])

程序示例:

--
filter :: (a->Bool) -> [a] -> [a]
filter _ [] = []
filter p (x:xs)
	|p x  = x : filter p xs
	|otherwise = filter p xs


--mytake :: (Eq) a => a ->[a] -> [a]

--mytake a [] = "error"

--mytake a [x]

--|a == x = []

--|otherwise = [x]

--mytake a (x:xs)

--|a == x =(xs)

--|otherwise = [x]:mytake a (xs)

|| as 模式(起别名)
将一个名字和“@” 置于模式前,可以将@后的整体通过该名称调用

capital :: string -> string
capital "" = "Empty string"
capital all@(x:xs) = "the first letter of " ++ all ++ " is " ++ [x]

|| Guards分支 (相当于if语句)

max' :: (Ord a) => a -> a -> a
max' a b
	|a > b  = a
	|otherwise = b

compare' :: (Ord a) a -> a ->Ordering
a `compare' ` b
	| a > b = GT
	| a == b = EQ
	| otherwise = LT

|| where关键字
对于程序来说是个局部变量,对于一个函数来说相当于全局变量,where 关键字跟在 guard 后面(最好是与竖线缩进一致),可以定义多个名字和函数。这些名字对每个 guard 都是可见的。
在这里插入图片描述

||
注意: 函数where的作用范围为本函数(包含所有guard在内的整个函数可见)

也可以where一个模式匹配:
在这里插入图片描述

|| let关键字
对于程序来说也是个局部变量,对于一个函数来说相当于局部变量,let绑定,定义局部变量,对不同的guard不可见
在这里插入图片描述
let in 表达式,let 中绑定的名字仅对 in 部分可见。
在这里插入图片描述

|| case 关键字
模式匹配的本质就是case语句的一种形式。以下代码等价
在这里插入图片描述

更灵活的使用
在这里插入图片描述
等价于
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值