仙境里的Haskell(之一)

仙境里的Haskell(之一)

仙境者,not realworld也 ~

并非说haskell语言不realworld,只是说我这个系列只打算讲not realworld的部分,其他的留待《魔界里的Haskell》吧 ( ̄Q ̄)╯

函数式编程语言,我先学习的是Haskell,所以后来学习Scala很轻松,在生产上使用很愉快。 每次有人问我怎么学习Scala,我的建议都是:学一点点Haskell。 然而很少有人听。。。所以再努力一次。 期望达到的目标是学习后用别的语言(比如Scala和Javascript)写代码的姿势能有所提高 ╮( ̄﹏ ̄)╭

haskell的官网最近改版的很酷炫,下载页面现在提供了三种安装方式,原来的官方安装包叫做Haskell Platform,不要装,装Stack,你以后在魔界的生活会轻松很多。装好后,在终端上输入stack ghci进入repl。 最好设置一下别名,以后输入ghci就进入repl,会方便一些。

Prelude> 1 + 1
2

验证一下repl是否正常。后面的学习内容可能一半是在repl里玩的。

repl里除了能执行haskell语句外,还可以执行很多辅助的命令,用 :? 可以看到命令清单。
最常用的命令是:t, :i , 和 :l、:r

:t 是:type的缩写,显示变量类型

Prelude> let x = 1
Prelude> :t x
x :: Num a => a 

(顺便说一句,在repl里设置变量的值要用let语句,在hs文件里写代码时是不需要的)

:i 是:info的缩写,显示给定名字的信息,不管这个名字是变量还是类型

Prelude> :i x           -- 显示x变量的信息
x :: Num a => a 	-- Defined at <interactive>:6:5
                         

Prelude> :i Num         -- 显示Num类型类的信息
class Num a where
  (+) :: a -> a -> a
  (-) :: a -> a -> a
  (*) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a
  	-- Defined in ‘GHC.Num’
instance Num Word -- Defined in ‘GHC.Num’
instance Num Integer -- Defined in ‘GHC.Num’
instance Num Int -- Defined in ‘GHC.Num’
instance Num Float -- Defined in ‘GHC.Float’
instance Num Double -- Defined in ‘GHC.Float’

:l 即:load 加载.hs文件,这样你就可以在repl里运行里面的函数了

*Nat> :l Nat.hs
[1 of 1] Compiling Nat              ( Nat.hs, interpreted )
Ok, modules loaded: Nat.

:r 即:reload,重新加载刚才加载的文件,这样你在修改文件后,:r一下就可以了,很简单就不演示了。

除了repl外,你还需要个编辑器,我以前一直用atom+haskell插件,最近入手了haskellformac,顾名思义只有Mac版,售价128软妹币,极力推荐。2016.6.21修正,这个编辑器用来做练习是非常好的,要用来做生产项目还是不太成熟)

这个编辑器把界面分为项目资源管理区、编辑区和playground。 在编辑区写的hs代码,可以在playground里尝试着玩玩,结果立刻显示,而且随着你编辑代码文件,playgound里的内容会自动重运算。 相当于自带repl+自动:l :r

环境基本准备好了,后面就可以开始肝了。特别鸣谢@阅千人而惜知己 ,他写了haskell函数式编程入门一书,上面的截图就是我在肝他这本书时敲的代码。

开坑第一篇就写到这,后面准备每周一篇的速度慢慢填坑。

最后留一行有趣的代码,大家可以在自己的repl里试试哦~

Prelude> let 1 + 1 = 3
Prelude> 1 + 1
3
编辑于 2016-06-21

文章被以下专栏收录

    主要会讨论关于函数式编程(haskell、scala)的内容。我会尽力讲的清晰明了,带你入坑,嘿嘿嘿。。。