假设我有一个定义为的数据类型
data Foo = Hello Int | World Int
Run Code Online (Sandbox Code Playgroud)
和作为
isWorld :: Foo -> Bool
isWorld (World i) = True
isWorld (Hello i) = False
getWorlds :: Set Foo -> Set World
getWorlds = Set.filter isWorld
Run Code Online (Sandbox Code Playgroud)
这不起作用:
Not in scope: type constructor or class `World'
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为World它只是一个函数,但我不知道如何在Haskell中对此进行建模.使用data正确吗?我希望能够仅为某些实例定义函数:
foo :: World -> Int
foo (World i) = i
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这会产生同样的错误,因为World它不是一种类型.有没有办法做到这一点,最好没有GHC扩展?
做到这一点最简单的方法是简单地为每个构造函数值的类型.
newtype Hello = Hello Int deriving (Eq,Ord)
newtype World = World Int deriving (Eq,Ord)
type Foo = Either Hello World
getWorlds :: Set Foo -> Set World
getWorlds = Set.fromList . rights . Set.toList -- import Data.Either
Run Code Online (Sandbox Code Playgroud)