创建一个 Haskell 选择器函数

Creating a Haskell selector function

我在 Haskell 中有以下两个类型定义,它们来自 Thompsons 'Craft of Functional Programmingi',第二版,1999 年。

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

当我尝试在这些类型上创建自己的 'selector function' 时:

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

GHCI 给我以下错误。

The type signature for ‘name’ lacks an accompanying binding

为什么 'name' 没有绑定到 ShopItem 元组的字符串元素,'price' 也是如此?

当前版本的 GHCI 是否不再接受这种旧语法?我在当前 Linux Mint 18.

上使用 7.10.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 }