像 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 #-}
),然后它就会正常工作并完全按照您的要求进行操作.
我记得这个来自 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 #-}
),然后它就会正常工作并完全按照您的要求进行操作.