我在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。
答案 0 :(得分:3)
您需要指定name
和price
的实现:
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 }