函数所有可能值的列表

sel*_*rus 2 reflection haskell functional-programming

我有多个对象,每个对象都与一个字符串关联。是否有某种模式允许以类型安全的方式获取所有字符串的列表?

data MyObject = Foo | Bar 

getObjectString :: MyObject -> String
getObjectString Foo = "Foo"
getObjectString Bar = "Bar"

-- Bad because not type safe and String duplication
listOfAllObjectStrings :: [String]
listOfAllObjectStrings = ["Foo", "Bar"] 
Run Code Online (Sandbox Code Playgroud)

不同的解决方案仍然不是类型安全的,但减少了字符串重复。

data MyObject = Foo | Bar 

getObjectString :: MyObject -> String
getObjectString Foo = listOfAllObjectString !! 0
getObjectString Bar = listOfAllObjectString !! 1

listOfAllObjectStrings :: [String]
listOfAllObjectStrings = ["Foo", "Bar"]
Run Code Online (Sandbox Code Playgroud)

sna*_*nak 6

MyObject一旦导出Enum和 ,您就可以获得 的所有值Bounded。然后,您将应用getObjectString每个值来获取字符串值。

data MyObject = Foo | Bar deriving (Enum, Bounded)

getObjectString :: MyObject -> String
getObjectString Foo = "Foo"
getObjectString Bar = "Bar"

listOfAllObjectStrings :: [String]
listOfAllObjectStrings = map getObjectString [minBound .. maxBound]
Run Code Online (Sandbox Code Playgroud)

  • 或者,[`getObjectString<$>universe`](https://hackage.haskell.org/package/universe-1.2.1/docs/Data-Universe.html#v:universe)。 (2认同)