问题描述
我记得来自 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 #-}
),然后它就会工作并完全按照您的意愿行事.