是否可以在没有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]
或者可能存在另一种运动目标的解决方案......?
答案 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方法可以做到这一点,因为它本质上打破了类型系统的抽象。