像 SML 一样直接在元组中定义类型?

Define types directly in tuple like SML?

我记得这个来自 SML 和 The Little MLer

fun has_steak (_ : meza, Steak : main, _ : dessert) = true
| has_steak _ = false

换句话说,三元组的类型是在线建立的,可以说没有明确的类型声明。所以如果我在 Haskell

中有这个
data Meza = Shrimp | Calamari | Escargots | Hummus deriving (Show,Eq)
data Main = Steak | Ravioli | Chicken | Eggplant deriving (Show,Eq)
data Salad = Green | Cucumber | Greek deriving (Show,Eq)
data Dessert = Sundae | Mousse | Torte deriving (Show,Eq)

这个

hasSteak :: (Meza,Main,Dessert) -> Bool
hasSteak (_,Steak,_) = True
hasSteak _ = False

工作正常,但我可以在 Haskell 中做一些类似于上面的内联 SML 的事情吗?这行不通

hasSteak ((_::Meza),Steak,(_::Dessert)) = True
hasSteak _ = False

还有这个

hasSteak (_,Steak,_) :: (Meza,Main,Dessert) = True
hasSteak _ = False

也不会飞。不过,我似乎在另一个上下文中看到过这种“内联”类型定义。

你说这个不行:

hasSteak ((_::Meza),Steak,(_::Dessert)) = True
hasSteak _ = False

但是它给出的错误是Type signatures are only allowed in patterns with ScopedTypeVariables。您所要做的就是打开 ScopedTypeVariables 扩展(在 GHCi 提示符下使用 :set -XScopedTypeVariables 或在 .hs 文件中使用 {-# LANGUAGE ScopedTypeVariables #-}),然后它就会正常工作并完全按照您的要求进行操作.