In this post we will examine some of the cool syntax that involves hte discussion of pattern matching, we will then discuss some advanced topic such as guard, where clause, let in and case statement, in summary the
- guard
- where clause
- let in
- case statement
wll have it special syntax.
The topic list of this post will comprise of the following.
- function signature
- type constraint
- parameter types
- pattern matching
- on single value such as String, Int
- pattern matching on list
- match variables
- wildcards (_)
- entity called 'patterns' to refer to matched variable
The code is as follow.
-- author -- boqwang -- refernces -- http://learnyouahaskell.com/syntax-in-functions -- pattern matching -- syntac constructs and starts with the pattern matching. lucky :: (Integral a) => a -> String lucky 7 = "LUCKY NUMBER SEVEN!" lucky x = "Sorry, you're out of luck, pal!" sayMe :: (Integral a) => a -> String sayMe 1 = "One!" sayMe 2 = "Two!" sayMe 3 = "Three!" sayMe 4 = "Four!" sayMe 5 = "Five!" sayMe x = "Not between 1 and 5" -- and we will define factorial again -- however, this time not with number n as produce [1 .. n] -- NOTE: -- you would not write the second factorial pattern first -- because doing that will probablly catch all cases, including 0 factorial :: (Integral a ) => a -> a factorial 0 = 1 factorial n = n * factorial (n - 1) -- non-exhaustive patterns charName :: Char -> String charName 'a' = "Albert" charName 'b' = "Broseph" charName 'c' = "Cecil" -- and if you call -- charName 'h' -- you will get an -- "*** Exception: tut.hs:(53,0)-(55,21): Non-exhaustive patterns in function charName -- patterns on tuples -- first a non-pattern matching definition -- addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a) -- addVectors a b = (fst a + fst b, snd a + snd b) -- then a pattern one addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a) addVectors (x1, y1) (x2, y2) = (x1 + x2, y1 + y2) -- we guarantee to have two pairs as parameters -- define fst, snd on triples first :: (a, b, c) -> a first (x, _, _) = x second :: (a, b, c) -> b second (_, y, _) = y -- and the "third" third :: (a, b, c) -> c third (_, _, z) = z -- postscript/addendum/epilogue/appendix/postlude -- _ means we don't care -- we have seen this "length' xs = sum [1 | _ <- xs ]" -- it means wildcards in general -- review the list comprehension -- we are actually using pattern matching in List comprehension -- let xs = [(1,3), (4,3), (2,4), (5,3), (5,6), (3,1)] -- [a + b | (a, b) <- xs] -- Lists themselves can be used in pattern matching -- [1,2,3] is just syntactic sugar to 1:2:3:[] -- and x:xs will bind head of hte list to x and the rest of it to xs -- the head function head' :: [a] -> a head' [] = error "can't call head on an empty list, dummy!" head' (x:_) = x -- test if that works -- head' [4,5,6] -- head' "hello" -- pattern matching a trivial case tell :: (Show a) => [a] -> String tell [] = "The list is empty" tell (x:[]) = "The list has one element: " ++ show x tell (x:y:[]) = "The list has two elements: " ++ show x ++ " and " ++ show y tell (x:y:_) = "This list is long. The first two elements are: " ++ show x ++ " and " ++ show y -- as we said, the length function provided by the built-in function is lame -- we will provide our own -- if you mistake (Num b) => [b] -> a, there would be a " Could not deduce (Num a) from the context (Num b)" error! length' :: (Num b) => [a] -> b length' [] = 0 -- since we don't care much about the variable binding below -- legnth' (x:xs) = 1 + length' xs length' (_ :xs) = 1 + length' xs -- and we can re-implements sum function as well sum' :: (Num a) => [a] -> a sum' [] = 0 sum' (x:xs) = x + sum' xs -- the things called as "pattern" capital :: String -> String capital "" = "Empty string, whoops!" capital all@(x:xs) = "The first letter of " ++ all ++ " is " ++ [x] -- capital "Dracula" -- what you can not do ? -- (xs ++ [x, y, z] or (xs ++ [x])
相关推荐
Programming-in-Haskell-2nd-Edition.pdf
Atom-haskell-ghc-mod.zip,haskell-ghc-mod atom packagehaskell ghc mod atom包,atom是一个用web技术构建的开源文本编辑器。
haskell-mode emacs haskell-mode emacs
Atom-ide-haskell-hoogle.zip,在光标下显示符号的滚动信息艾德·哈斯克尔·胡格尔,atom是一个用web技术构建的开源文本编辑器。
Haskell-Data-Analysis-Cookbook, Haskell数据分析 cookbook的附带源代码 Haskell-Data-Analysis-Cookbook这是 Haskell数据分析 cookbook的附带源代码。最新的源代码可以在GitHub上获得: ...
从1.0.0开始,haskell-ghc-mod提供haskell-completion-backend服务。 注意:在1.0.0之前,提供了ide-backend服务。 它已被废弃以支持ide-haskell的UPI。 您可以在找到描述 执照 版权所有:copyright:2015 Atom-...
安装过程中应在路径上放置一个名为haskell-in-haskell的可执行文件。 否则,您可以使用cabal run haskell-in-haskell --直接运行项目,然后输入要传递的参数。 编译中 要编译Haskell文件,只需运行: haskell-in-...
haskell-ghc-mod原子包 该软件包主要用作后端。 Haskell ghc-mod打开通往ghc-modi的管道,并查询类型,信息并检查错误。 安装与配置 请参考官方文档站点 服务中心API 从1.0.0版本开始,haskell-ghc-mod提供...
Get Programming with HASKELL-2018-英文版
用于 haskell-relational-record 的 MySQL 驱动程序 这个项目被合并到 。 准备 $ git clone git@github.com:khibino/haskell-relational-record.git $ git clone git@github.com:bos/hdbc-mysql.git $ git clone ...
演示医疗用例的参考DAML应用程序 -Haskell-TypeScript-下载
Progrtamming in Haskell 2nd edition ppt仅供学习,禁止用于商业行为。Progrtamming in Haskell 2nd edition ppt仅供学习,禁止用于商业行为。Progrtamming in Haskell 2nd edition ppt仅供学习,禁止用于商业行为...
haskell-chart, haskell的2D 图表库 图 haskell的2D 图表库进一步的信息可以在关联的 wiki中找到。
Server Metaprogramming Ruby-Pyton-Groovy-Haskell-Erlang.pdf
A History of Haskell - Being Lazy With Class
haskell-brainfuck 解释 haskel-brainfuck 作为库分发,但它也包含一个可执行文件来运行 Brainfuck 程序。 你可以在找到 haskell-brainfuck用法图书馆 import HaskBF.Evalimport qualified Data.ByteString.Lazy as ...
Atom-ide-haskell-cabal.zip,Cabal backend provider for ide-haskellIDE Haskell Cabal套餐,atom是一个用web技术构建的开源文本编辑器。
这种浓缩的代码和语法参考以一种组织良好的格式呈现了基本的haskell语法,可以用作快速而方便的参考,包括云计算和数据分析的应用程序。本书介绍了haskell的功能编程特性,以及强大的静态类型、懒惰的评估、广泛的...
haskell-lsp-client 该软件包适用于希望使其文本编辑器与兼容的文本编辑器的开发人员。 我已经开发了此软件包,并计划将其集成到。 示例客户端 该存储库中包含一个示例客户端。 此示例客户端仅运行并打开在命令行...
Atom-atom-haskell-scry.zip,De-emphasize qualified Haskell identifiers.SCRY,atom是一个用web技术构建的开源文本编辑器。