创建Haskell选择器函数

时间:2016-10-16 21:31:57

标签: haskell types synonym

我在Haskell中有以下两种类型定义,它们来自Thompsons' Craft of Functional Programmingi',Second Edition,1999。

type ShopItem = (String,Int)
type Basket   = [ShopItem]

当我尝试创建自己的选择器功能时#39;在这些类型上:

name  :: ShopItem -> String
price :: ShopItem -> Int

GHCI给我以下错误。

The type signature for ‘name’ lacks an accompanying binding

为什么不命名'绑定到ShopItem元组的String元素,同样为' price'?

这种旧语法在当前版本的GHCI中是否已不再可接受?我在当前的Linux Mint 18上使用版本7.10.3。

1 个答案:

答案 0 :(得分:3)

您需要指定nameprice的实现:

name :: ShopItem -> String
name (n, _) = n

price :: ShopItem -> Int
price (_, p) = p

您也可以使用data代替type,并使用记录表示法:

data ShopItem = ShopItem { name :: String, price :: Int }

然后这些可用于提取字段:

item = ShopItem { name = "Beans", price = 2 }
-- or
item = ShopItem "Beans" 2

name item  ==  "Beans"

但也要替换它们:

item { price = 4 }  ==  ShopItem { name = "Beans", price = 4 }