解释的Haskell数据

时间:2016-06-18 10:17:38

标签: haskell

我正在寻找数据卡后这个'Of`的一个很好的解释:

data Suit = Club | Diamond | Spade | Heart deriving (Eq, Show, Ord, Enum)
data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Bobe | Dame | King | Ass deriving (Ord, Eq, Show, Enum)

data Card = Value `Of` Suit
    deriving (Show)  

我没有让它成为一个好的Doc或解释。

2 个答案:

答案 0 :(得分:4)

在haskell中任何(非运算符,非部分应用)函数,即类型签名f :: a -> b -> c,都可以使用中缀 - 使用反引号 - 语法,你可以使用它用反引号函数,例如

mod m n = m `mod` n

这里函数的第一个参数位于"运算符"的左侧。而右边的第二个。

反过来说,如果你有一个运算符+并且你想用前缀表示法应用它,你只需用()

包围它。
a + b = (+) a b

回到您的代数数据类型,以通常的方式编写

data Card = Of Value Suit deriving (...)

如果您现在加载文件或将定义粘贴到ghci,您可以向交互式编译器询问表达式的类型。

$ > ghci
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> data Suit = Heart |... deriving Show
Prelude> data Value = One |... deriving Show
Prelude> data Card = Of Value Suit deriving Show
Prelude> :t Of
Of :: Value -> Suit -> Card

这正是我们使用中缀语法所需的类型 - 然后我们可以使用以下形式:

Prelude> One `Of` Heart
Of One Heart

注意:如果你想拥有两个以上参数的功能,你必须给它一个像

这样的名字
:t foldl
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
Prelude> -- an example of a function with 3 parameters
Prelude> 0 `foldl (+)` [1..10]

<interactive>:14:10: parse error on input ‘(’
Prelude> let plus = (+)
Prelude> 0 `foldl plus` [1..10]

<interactive>:16:10: parse error on input ‘plus’

不起作用,但这将

Prelude> let sumStartingAt = foldl (+)
Prelude> 0 `sumStartingAt` [1..10]
55

答案 1 :(得分:2)

值构造函数只是一个函数。在ghci中查看。

Prelude> data T = F Int Int | Int `G` Int deriving Show
Prelude> :t F
Int -> Int -> T
Prelude> 1 `F` 2
F 1 2
Prelude> :t G
Int -> Int -> T
Prelude> G 1 2
G 1 2

由于它是一个函数,您可以使用中缀表单。

也许是中缀声明表格困扰着你。这只是表达的另一种方式。

type P = (Int, Int)
(#*) :: P -> P -> Int
(a, b) #* (c, d) = a * d - b * c