返回子类型集

jus*_*.me 2 haskell types ghc

假设我有一个定义为的数据类型

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扩展?

use*_*560 5

做到这一点最简单的方法是简单地为每个构造函数值的类型.

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)

  • 您可以构建自己的东西而不是使用`Either` - 例如`data Foo = Hello Hello | 世界世界| Bla Bla`等 (8认同)