Ix

数组下标类型

Prelude> :m +Data.Array
Prelude Data.Array> data Colour = Red | Orange | Yellow | Green | Blue | Indigo | Violet deriving (Show,Eq,Ord,Ix)
Prelude Data.Array> range (Yellow,Blue)
[Yellow,Green,Blue]
Prelude Data.Array> index (Yellow,Blue) Green
1
Prelude Data.Array> inRange (Yellow,Blue) Red
False

Array UArray

数组类型,类型参数有两个,下标类型 i 和元素类型 e。

Array是装箱数组类型(元素为指针)

UArray是非装箱数组类型(元素为实体)

Prelude> :m +Data.Array
Prelude Data.Array> a = array (1,10) ((1,1) : [(i, i + a!(i-1)) | i <- [2..10]])
Prelude Data.Array> :t a
a :: (Ix e, Num e, Enum e) => Array e e
Prelude Data.Array> a!10
55
Prelude Data.Array> bounds a
(1,10)
Prelude Data.Array> indices a
[1,2,3,4,5,6,7,8,9,10]
Prelude Data.Array> elems a
[1,3,6,10,15,21,28,36,45,55]
Prelude Data.Array> assocs a
[(1,1),(2,3),(3,6),(4,10),(5,15),(6,21),(7,28),(8,36),(9,45),(10,55)]
Prelude Data.Array> array ((1,1),(2,2)) [((2,1),"C"),((1,2),"B"),((1,1),"A"),((2,2),"D")] ! (2,2)
"D"
Prelude Data.Array> array ('a','c') [('a',"AAA"),('b',"BBB"),('c',"CCC")] ! 'b'
"BBB"
Prelude> :m +Data.Array.Unboxed
Prelude Data.Array.Unboxed> a = listArray (1,10) [1..10] :: UArray Int Int
Prelude Data.Array.Unboxed> a
array (1,10) [(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10)]
Prelude Data.Array.Unboxed> a // [(1,100),(2,99)]
array (1,10) [(1,100),(2,99),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10)]

IOArray IOUArray

在IO monad中使用的数组。

函数 参数 功能
newArray 区间和初值 新建带初值的数组
readArray 数组和下标 读取数组某个元素的值
writeArray 数组,下标和值 设置数组某个元素的值
getElems 数组 读取数组所有元素的值
Prelude> :m +Data.Array.IO
Prelude Data.Array.IO> a <- newArray (0, 2) 0 :: IO (IOUArray Int Int)
Prelude Data.Array.IO> getElems a
[0,0,0]
Prelude Data.Array.IO> writeArray a 0 3
Prelude Data.Array.IO> readArray a 0
3
Prelude Data.Array.IO> writeArray a 1 6
Prelude Data.Array.IO> getElems a
[3,6,0]
Prelude Data.Array.IO> writeArray a 2 7
Prelude Data.Array.IO> getElems a
[3,6,7]

STArray STUArray

在ST monad中使用的数组。

-- https://stackoverflow.com/questions/8197032/starray-documentation-for-newbies-and-state-st-related-questions

import Control.Monad
import Control.Monad.ST
import Data.Array.ST
import Data.Array.Unboxed primesUpto :: Int -> [Int]
primesUpto n = [p | (p, True) <- assocs $ sieve n] sieve :: Int -> UArray Int Bool
sieve n = runSTUArray $ do
sieve <- newArray (2, n) True
forM_ [2..n] $ \p -> do
isPrime <- readArray sieve p
when isPrime $ do
forM_ [p*2, p*3 .. n] $ \k -> do
writeArray sieve k False
return sieve main = print $ primesUpto 100

Haskell语言学习笔记(21)Array的更多相关文章

  1. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  2. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  5. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  6. Go语言学习笔记(四) [array、slice、map]

    日期:2014年7月22日   一.array[数组]   1.定义:array 由 [n]<type> 定义,n 标示 array 的长度,而 <type> 标示希望存储的内 ...

  7. Haskell语言学习笔记(72)Free Monad

    安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...

  8. Haskell语言学习笔记(28)Data.Map

    Map Prelude> import Data.Map as Map Prelude Map> :set -XOverloadedLists Prelude Map> Overlo ...

  9. Haskell语言学习笔记(44)Lens(2)

    自定义 Lens 和 Isos -- Some of the examples in this chapter require a few GHC extensions: -- TemplateHas ...

随机推荐

  1. FineUI 单击菜单页面内容完全刷新,关闭Tab

    res/js/main.js  修改initTreeabStrip 中    refreshWhenExist.refreshWhenTabChang两参数值 // 初始化主框架中的树(或者Accor ...

  2. Windows OS系统变量

    %userprofile% C:\Users\Administrator\ %windir% C:\Windows\

  3. bootstrap+font-awesome表单

    bootstrap+font-awesome表单 <form action="" class="form-horizontal col-sm-offset-4&qu ...

  4. 管道和FIFO 一

    管道和FIFO   管道(pipe)       管道在Unix及Linux进程间通信是最基础的,很容易理解.管道就像一个自来水管,一端注入水,一端放出水,水只能在一个方向上流动,而不能双向流动.管道 ...

  5. RabbitMQ-2 工作队列

    参考:http://rabbitmq.mr-ping.com/ 工作队列 (使用pika 0.9.5 Python客户端) 在第一篇教程中,我们已经写了一个从已知队列中发送和获取消息的程序.在这篇教程 ...

  6. bzoj4385 Wilcze doły

    Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. Input 第一 ...

  7. shell 1基础

    shell简介 shell是一个用C语言编写的程序,是用户使用Linux的桥梁.shell既是一种命令语言,又是一种程序设计语言. shell脚本(shell script),是一种为shell编写的 ...

  8. CentOS 6.2图形界面允许root用户登录

    测试环境中,很多操作需要root用户权限,为了提高测试效率,因此有时希望直接使用root用户登陆系统,但是CentOS的图形界面默认不允许root用户登陆,这是由于pam的限制,需要进行如下设定: 1 ...

  9. 「CQOI2016」K 远点对

    /* 考虑暴力 可以n ^ 2枚举点对 然后用一个容量为2k的小根堆来维护第k大 kd-tree呢就是来将这个暴力优化, 每次先找远的并且最远距离不如堆顶的话就不继续找下去 貌似挺难构造数据卡的 */ ...

  10. linux 系统管理 实战技巧

    一.这篇文章讲了什么? 这篇文章很有参考性哈.本来是想等一段时间有更多条技巧后在发布的,不过,突然发现,我是去年的今天在博客园落户了,祝我的博客一周岁快乐,希望以后多分享一些文章啦.所以就把草稿箱的其 ...