创建一个 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 版
您需要指定 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 }
我在 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 版您需要指定 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 }