是否可以编写“isa”/“匹配”功能

时间:2017-06-09 10:24:35

标签: haskell

是否可以在没有TH的情况下在Haskell上编写“isa”或“match”函数?它必须获取构造函数和值,并将值与此构造函数匹配,但构造函数可以有多个参数。例如:

data X = X a b|Y {age::Int, name::String}
isa c v = ???
goal_of_exercise x y|iff all (isa X) x y = 1
                    |iff any (isa Y) x y = 2
  where iff agg c a b = agg c [a, b]

或者可能存在另一种运动目标的解决方案......?

1 个答案:

答案 0 :(得分:4)

你要求的功能不仅不可能写 - 它在Haskell的背景下绝对没有意义。

在Haskell中,所有(大多数)数据类型确实如您所观察到的那样,在运行时标记了带有类型信息的联合。这允许模式匹配起作用:

.exandibleContent

这适用于一种特定类型的构造函数。 data D = A | B whichD :: D -> String whichD A = "it's an A" whichD B = "it's a B" 的签名明确表示它需要whichD,可以使用其构造函数之一构造它。如果你想将它扩展到比如D,你可以使用和类型:

D'

现在,有些情况并非如此,即参数化的上下文:

data OneOf = OneD D | OneD' D'

现在,是否可以针对某些特定specialShow :: Show a => a -> String specialShow a = "it's a special " ++ show a 更改specialShow的行为?原则上是的,但不在该签名下。通常,您会引入自己的类型类并为您想要的类型提供特定实例,并为您想要引入的所有其他类型使用通用代码。这可能会导致重叠实例出现一些问题,但这样做了解的。

如果坚持进行运行时检查,该怎么办?我不认为这甚至可以在所有情况下工作,但可能使用一些编译器内在函数,你可以强迫它告诉你更多关于实际价值的信息。我很确定没有标准的Haskell方法可以做到这一点,因为它本质上打破了类型系统的抽象。