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. virtualbox centos安装增强工具和问题详解

    virtualbox centos安装增强工具和问题详解 VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox 在虚拟机中安装 ...

  2. 【Reporting Services 报表开发】— 怎么根据当前表单的guid作为参数查询相关数据?

    select AId from FilteredA as CRMAF_FilteredA 用这个 作为一个DataSet1 , 然后添加在报表里面添加一个参数 @AId,设置的默认的查询为前面Data ...

  3. java 使用POI读写Excel文件(兼容2003、2007)

    package com.jadyer.demo; import java.io.File; import java.io.FileOutputStream; import java.io.IOExce ...

  4. android设备唯一码的获取,cpu号,mac地址

    抄自http://blog.csdn.net/hpccn/article/details/7872141 开发Android应用中,我们常常需要设备的唯一码来确定客户端. Android 中的几中方法 ...

  5. Kubernetes集群安全配置案例

    Kubernetes 系统提供了三种认证方式:CA 认证.Token 认证 和 Base 认证.安全功能是一把双刃剑,它保护系统不被攻击,但是也带来额外的性能损耗.集群内的各组件访问 API Serv ...

  6. Bootstrap-CSS:网格系统

    ylbtech-Bootstrap-CSS:网格系统 1.返回顶部 1. Bootstrap 网格系统 本章节我们将讲解 Bootstrap 的网格系统(Grid System). Bootstrap ...

  7. 1044 Shopping in Mars (25 分)

    1044 Shopping in Mars (25 分) Shopping in Mars is quite a different experience. The Mars people pay b ...

  8. 解决 pycharm can not save setting

    这个问题出现的原因是因为PyCharm中存在相同名字的虚拟环境变量. 解决方法:Configure Python Interpreter 点击右上角齿轮状按钮, 选择 show all,然后删除相同名 ...

  9. Session的使用与Session的生命周期

    1.HttpSession的方法 Object getAttribute(String); Enumeration<String> getAttributeNames(); long ge ...

  10. python之路之装饰器

    一 装饰器进化之路1) import time def index(): start_time=time.time() time.sleep() print('welcome to index wor ...