Skip to content

Instantly share code, notes, and snippets.

@jackywyz
Created December 2, 2011 07:29
Show Gist options
  • Save jackywyz/1422195 to your computer and use it in GitHub Desktop.
Save jackywyz/1422195 to your computer and use it in GitHub Desktop.
Haskell总结

###haskell 基本类型,bool,list,tuple,int,Integer,Double,char ,string,function

1)let/in 在函数的应用
root s = 
    let p = 2
    in s*p 
2)List类型
 *s = [1,2,3] ; s!!0 取值
 *函数 null ,length, head,tail,last,init,sum,product,reverse,take,drop,maximum,elem,
 *a = [1..2],coffescript 也有
 *没有mapMap.fromList [(5,'a'), (3,'b')] ! 5

3)匿名函数
(\a->a*2) 2

4) 没有循环用迭代代替[a | a <- [1,2,3]]

5门卫
 f a b 
  |a==b = b
  |a > b = a
  
两个冒号 ::
符号 :: 读作 ” 具有类型”, 比如 x :: y 形式的内容 就应该理解成: 表达式x具有类型y
有几种情况, 一种是
函数定义,冒号前是 函数名称, 冒号后 是函数的输入输出的类型定义
另外就是 列表的类型定义, 如 [1,2,3,4,5] :: [Int] 表示 [1,2,3,4,5] 是一个Int类型的列表
['a', 'a', 'b'] :: String 表示 一个字符列表, 也就是字符串
很多时候都不需要进行类型声明。那是因为 Haskell 可以暗中推断,不必声明之。也就是说,如果省略 :: 和后面的类型,Haskell编译器会推断这个表达式的类型。
两横 (两个减号) –
单行注释
大括号和减号 {- -}
括起来的部分都是注释, 前括号 和 后括号 可以放在不同的行
右箭头 ->
定义函数的输入输出的类型, 也就是定义函数的类型
1)如果只有输入, 没有输出, 就没有箭头
2) 有多个输入参数, 依次用 -> 相连, 最后一个才是 输出
另外,在case表达式中, 连接模式和相应的结果, 如
firstDigit :: String -> Char
firstDigit st
= case (digits st) of
[] -> '\0'
(x:_) -> x
一个case 表达式可用于区分不同的分支选择, 在上面这个例子中,是空列表和非空列表
左箭头 <-
属于, 在list comprehension中, 表示一个元素 属于 哪个列表 (集合)
这个跟数学符号 表示 元素属于哪个集合,是一样的意思
另外一种用法 类似于 赋值
do { n <- readLn ; print (n^2) }
这段代码,就是将从标准输入读取到的数字 赋值给 n, 然后打印出n的平方
但是只限于 IO action, 对于普通的函数, 必须用 let = 来赋值
vertical bar符号 |
竖线符号, 这个符号,在C语言中表示按位与
在Haskell中表示 guide
用来在函数中表示不同的情况, 有点类似与C语言的switch case的意思
比如,求两整数之间的最大值
max :: Int -> Int -> Int
max x y --max是函数名, x y是两个形式参数
| x >=y = x --表示如果x>=y 这个条件成立,最大值就等于x
| otherwise = y
guide是模式匹配的扩展, 可以将竖线读作 ” 当…时”
另外,在list comprehension中, 竖线 分割列表的定义和描述
设列表ex为[2, 4, 7] 则列表概括 [2*n | n <- ex] 表示列表 [4, 8, 14]
第3种情况,就是用data定义数据时用来枚举不同的情况
data Maybe a = Nothing
| Just a
data Either a b = Left a
| Right b
data Color
= Red
| Orange
| Yellow
| Green
| Blue
| Purple
| White
| Black
它与guide的区别是,第1种情况的前面,不需要 | 符号, 而guide的每种情况都需要
元组 (,,)
括号里有若干个用逗号分割开的元素
这个概念跟python中的tuple是差不多的
列表 [,,]
方括号中包含 若干个逗号分割开的元素
跟python中list也是差不多的
++
列表的连接, 比如 “Hello” ++ “World” 的结果是 “HelloWorld”
=>
(Eq a) => a -> a -> Bool
它左边的部分叫做类型约束(type constraint), 有人把 类型约束叫做 context
下划线 _
通配符, 在模式匹配中, 可以与任何参数都匹配
比如 x:_ 匹配非空列表
单冒号 :
在列表中,表示连接, 如 3:[] = [3] 以及 2:[3] = [2,3]
冒号称之为cons运算
反引号`
英文中叫做gave accent, 或者backquote , backtick.
键盘中中, 它在 ~ 符号的下面, 也就是按住shift会输入~, 不按shift就会输入 `
两个感叹号 !!
取列表的下标元素
let x = [abcdefg]
x!!6
就为’g’
关键字
case
class
data
default
deriving 这个不常见
do
else
if
import
in
infix 这3个也不常见
infixl
infixr
instance
let
module
newtype
of
then
type
where
这样说来,关键字是没有多少的
单引号’
1. 用单引号将单个字符括起来, 这与C语言中的语法是一致的
2. 单个单引号是函数名的一部分, 比如 foldl’
作为高阶函数参数的函数通常命名冠以 f、g 等,但有时也像类型变量后门带一些数字进行修饰那样, 函数名后面会带单引号 ‘ 进行修饰 ,例如像 g’
在以后的例子中,你可以把它读作 “Jee-prime”,并且它被认为是一个与 g 函数有特定关系(a helper or the like)的函数。
请参考
Haskell语法
How to read Haskell
如何阅读Haskell代码
比如
foldl — 从左到右遍历它的结构
foldl’ — a fold that is strict in its accumulator, “‘” is used to indicate a strict variant of a function
点号.
函数复合
美元符号 $
函数应用 function application
在标准库Prelude中, ($)的定义为
f $ x = f x
这个函数的优先级非常低, 这意味着它可以用来代替括号
foo x y = bar y (baz (fluff (ork x)))
可以改写成
foo x y = bar y $ baz $ fluff $ ork x
这基本上类似于 函数复合 点号的语法
反斜线 /
匿名函数,lamda函数
例如
\xs -> length xs > 15
就定义了一个lamda函数,它的参数是xs, 左右就是判断 xs的长度是否大于 15
@davidxifeng
Copy link

(*3),(+3)偏应用函数

我觉得翻译成 部分应用函数 比较好。好像这个用的比较多。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment