我正在寻找数据卡后这个'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或解释。
答案 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