let's use the monad to solve some problems. here is a famous question,
Say you have a chess board and only one knight piece on it. We want to find out if the knight can reach a certain position in three moves. We'll just use a pair of numbers to represent the knight's position on the chess board. The first number will determine the column he's in and the second number will determine the row.
let's make the type synonyms for the knight currrent position on the chess board:
type KnightPos = (Int,Int)
so let's make a method that can calculate the position after one move after the knight moves.
we can write this :
moveKnight :: KnightPos -> [KnightPos] moveKnight (c,r) = do (c',r') <- [(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1) ,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2) ] guard (c' `elem` [1..8] && r' `elem` [1..8]) return (c',r')
this can also be written as this, if you writre with "filter"
moveKnight :: KnightPos -> [KnightPos] moveKnight (c,r) = filter onBoard [(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1) ,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2) ] where onBoard (c,r) = c `elem` [1..8] && r `elem` [1..8]
with that , we can do in3 which get the all the possible location as such :
in3 :: KnightPos -> [KnightPos] in3 start = do first <- moveKnight start second <- moveKnight first moveKnight second
and then you can chain that by cropping up in several times, the above code can be wite as this withou tthe do notation.
in3 start = return start >>= moveKnight >>= moveKnight >>= moveKnight
now, let's take a function takes two positions and tell if we can reach that is like this:
canReachIn3 :: KnightPos -> KnightPos -> Bool canReachIn3 start end = end `elem` in3 start
now, let's test it .
ghci> (6,2) `canReachIn3` (7,3) False
相关推荐
Haskell Monads小书 :warning: 初稿! –请仔细阅读 1. do块 2.解释嵌套的Lambda和绑定 =<<作为序列运算符 2C 。 a- a -> M b背后的直觉 2D合成do块 2E 。 嵌套do块 3.实现Monad和封装 3A 。 新型和副...
“haskell-do::pencil2:-Haskell代码编辑器专注于交互式开发” 这个标题揭示了我们正在讨论一个专为Haskell编程语言设计的代码编辑器,名为“haskell-do::pencil2”。这个编辑器强调的是交互式编程体验,这意味...
【标题】:“yesod-haskell-json-api-starter:使用Postgres的Yesod JSON API模板”是一个基于Haskell编程语言和Yesod框架构建的项目模板,专门用于快速搭建使用PostgreSQL数据库的JSON API服务。 【描述】:这个...
这个名为"Atom-atom-haskell-pointfree"的压缩包是针对Atom编辑器的一个插件,专门用于Haskell编程语言。插件的核心功能是将Haskell代码中的函数表示从“有指针”形式(pointful)转换为“无指针”形式(pointfree)...
用于 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 ...
指示: $ git clone https://github.com/haskell-servant/haskell-servant.github.io.git$ cd haskell-servant.github.io/$ git checkout hakyll$ cabal sandbox init && cabal install --dep# go for a walk$ cabal...
在压缩包“haskell-for-typescript-devs-master”中,你可能找到了一系列的教程、示例代码或者解释文档。这些资料可能包括了: 1. **介绍**:介绍Haskell的历史、哲学和与其他语言的对比,帮助你理解为什么选择学习...
在 Emacs 中,`haskell-mode` 是一个专门为了提升 Haskell 开发体验而设计的模式。 `haskell-mode` 提供了多种增强功能,旨在帮助 Haskell 开发者更高效地编写、调试和理解代码。这个模式包括以下关键特性: 1. **...
"Haskell-Lens-Tutorial-Library"显然是一个旨在弥补官方文档中教程不足的资源,帮助开发者更好地理解和应用Lens库。 首先,我们来了解一下什么是Lens。在Haskell中,一个Lens可以看作是对数据结构中的某个部分的一...
Atom-ide-haskell-hoogle 是一个专门为 Atom 编辑器设计的插件,它整合了 Haskell 的 Hoogle 工具,以提供强大的代码提示和搜索功能。Atom 是一款由 GitHub 开发的开源文本编辑器,它利用现代 web 技术如 HTML、CSS ...
在深入探讨"Haskell-CPU-Instruction-Counter"项目之前,我们先来理解一下涉及的关键概念。Haskell是一种纯函数式编程语言,以其强类型、惰性求值和高阶函数特性而闻名。性能分析是软件开发中的一个重要环节,用于...
`Haskell-learn-functional-programming`这个项目很可能是包含一系列的示例、练习和教程,可能涵盖上述概念以及更多内容,如类型类、monads、GHCi交互式环境、类型系统高级特性、错误处理、IO操作等。通过学习这个...
haskell-jp官方网页 服务方式 $ stack install wai-app-static $ stack exec warp -- --host 0.0.0.0 --docroot . 这只是示例方式。 但对于Haskellers来说,这可能是最简单的!
从1.0.0开始,haskell-ghc-mod提供haskell-completion-backend服务。 注意:在1.0.0之前,提供了ide-backend服务。 它已被废弃以支持ide-haskell的UPI。 您可以在找到描述 执照 版权所有:copyright:2015 Atom-...
haskell-elm-todo-app 2019年9月24日更新:支持GHC 8.6.5和Elm 0.19 Todo应用在服务器端使用 ( , )构建,在客户端使用构建。 随机笔记(2016) Elm应用程序的模块化结构基于的文章“”。 它还使用的elm-return...
**aws-lambda-haskell-runtime** 是一个专门为 AWS Lambda 服务设计的 Haskell 运行时环境。AWS Lambda 是亚马逊网络服务(Amazon Web Services, AWS)提供的一种无服务器计算平台,允许开发者执行代码而无需预置或...
这是用Haskell编写的用于解决SAT的经典DPLL算法的简单实现它使用Happy解析器来解析公式。 要运行它只需 cabal install alexcabal install happycabal configurecabal run < cnf
haskell-neo4j-rest-client Haskell neo4j REST客户端 有关更多文档: : 有关更多用法示例,请查看文件tests / IntegrationTests.hs中的集成测试。
Haskell型Kong教程学习如何在Haskell中使用带类型的Kong进行编程的练习。... git clone https://github.com/chrisbarrett/haskell-typed-holes-tutorialcd haskell-typed-holes-tutorialstack build
向你学习 Haskell-for-good-good 我的工作通过 Learn You a Haskell for Great Good! 完全的: 介绍 出发 类型和类型类 函数中的语法 递归 高阶函数 模块 制作我们自己的类型和类型类 输入和输出 函数式解决问题...