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

问题描述

我记得来自 SML 和 The Little MLer

COMMIT

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

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

这个

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)

工作正常,但是我可以在 Haskell 中执行类似于上面的内嵌 SML 的操作吗?这不起作用

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

还有这个

hassteak ((_::Meza),(_::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 #-}),然后它就会工作并完全按照您的意愿行事.