美文网首页
Haskell笔记4

Haskell笔记4

作者: b7c9833ccf70 | 来源:发表于2018-06-20 22:35 被阅读0次

 divide and conquer

这一部分主要是对作业中divideAndConquer的解释,因为我觉得这个...一开始就没怎么理解。

divideAndConquer ::

  (a -> Bool) ->

  (a -> b) ->

  (a -> (a,a)) ->

  (b -> b -> b) ->

  a -> b

divideAndConquer simpleEnough simpleCases splitFunction combineFunction =

  recursively

  where

    recursively input =

      if simpleEnough input then simpleCases input

      else

        let

          (left,right) = splitFunction input

        in

          combineFunction (recursively left) (recursively right)

sort :: [Integer] -> [Integer]

sort =

  divideAndConquer

  (\list -> length list <=1)

  id

  (\list-> splitAt(length list`div`2) list)

  merge

merge::[Integer]->[Integer]->[Integer]

merge [] ys = ys

merge xs [] = xs

merge (x:xs) ys | x

这里我们尝试使用divideAndConquer方法来进行merge sort。

首先divideAndConquer的定义:

divideAndConquer ::

  (a -> Bool) ->

  (a -> b) ->

  (a -> (a,a)) ->

  (b -> b -> b) ->

  a -> b

它接受4个函数加一个任意类型的参数返回一个任意类型的参数。

在后面recursivly给出来具体的定义。

recursively

  where

    recursively input =

      if simpleEnough input then simpleCases input

      else

        let

          (left,right) = splitFunction input

        in

          combineFunction (recursively left) (recursively right)

我们结合后面的具体定义一起来看:

 divideAndConquer

  (\list -> length list <=1)

  id

  (\list-> splitAt(length list`div`2) list)

  merge

simpleEnough检查list是否被分解到长度为1或者0,如果是它返回simpleCase,在这里,由于元素少于两个,所以没有作排序的必要,我们直接返回它本身即 identity function -- id。

如果不是,那么我们首先将list分为两半然后merge这两半。对于每个要merge的对象,我们再应用recursivly。迭代将于长度为1终止。例如:

[2,1,4,3] = merge [2,1] [4,3] = merge (merge [2] [1]) (merge [4] [3])

对于[1],[2],[3],[4]来说,它们都simpleEnough也所以应用了simpleCases即返回它们本身。然后进行了merge。

[2,1,4,3,5] = merge [2,1] [4,3,5] = merge (merge [2] [1]) (merge [4] [3,5]) =  merge (merge [2] [1]) (merge [4] (merge [3] merge [5]))

相关文章

  • Haskell笔记4

    divide and conquer 这一部分主要是对作业中divideAndConquer的解释,因为我觉得这个...

  • Haskell笔记2

    1 Polymorphic Types 在很多情况下,不同的数据类型会有相同功能的函数,例如判定相等或者不等,Li...

  • Haskell笔记3

    1.foldr foldr::(a->b->b)->b->[a]->b foldr函数应用在list上,它的功能就...

  • Haskell笔记1

    前言 这个学期开始学习Haskelll(主要关于Codeworld和ghci),感觉很多东西和OOP不一样,最近感...

  • 函数式的宗教-00: 认识lisp(clojure)与haske

    总体大纲: lisp与haskell简单介绍 lisp与haskell应用领域 lisp与haskell技术分析 ...

  • monad以及monad的四条定理

    haskell的范畴是hask范畴(haskell的所有类型隶属于hask范畴),所以haskell的所有函子都是...

  • Haskell 99 Problems

    H-99: Ninety-Nine Haskell Problems 2017-4-7 首先附上地址: 99 ...

  • 01 数据类型

    swift中结构体在haskell中的描述 枚举类型在haskell中的描述 枚举携带类型在haskell中描述 ...

  • 《Real World Haskell》笔记(4):函数式编程

    一个简单的命令行程序 该接口程序读入一个文件,将函数应用到文件,并且将结果写到另一个文件 do 关键字引入一个块,...

  • Haskell基础

    [TOC] 假设读者都有函数式编程方面的知识。这个笔记只是记录笔者觉得Haskell 最有特点的几个地方。 概念 ...

网友评论

      本文标题:Haskell笔记4

      本文链接:https://www.haomeiwen.com/subject/gwlfyftx.html