Let StringWrapper1
and StringWrapper2
是包裹字符串的两种类型(即newtype StringWrapper1 = StringWrapper1 String
and newtype StringWrapper2 = StringWrapper2
).
现在假设我们正在尝试创建一个函数StringWrapper1
to StringWrapper2
.
funcWrapper :: StringWrapper1 -> StringWrapper2
一方面,我们想要明确我们传递给这个函数的是StringWrapper1
,所以我们不想仅仅治疗StringWrapper1
作为类型同义词String
(这会导致错误,我自己的经验可以证明)。另一方面,在概念性地构建函数时,我们仍然在某种程度上思考String
s。那么我们要做的就是首先构建func
这并不需要我们不断地包装和展开类型:
func :: String -> String
然后,我们使用func
建造funcWrapper
:
funcWrapper :: StringWrapper1 -> StringWrapper2
funcWrapper (StringWrapper1 str) = StringWrapper2 (func str)
问题/疑问:这是惯用语吗?不断地用一个函数来重复每个函数似乎很尴尬func
and a funcWrapper
。 Haskell 是否提供了我所缺少的其他方法?或者我应该只使用类型同义词?
正如其他人所说,您应该确保这确实是您想要做的(请参阅 leftaroundabout 的评论)。如果是的话,您可以使用coerce来自标准库 https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Coerce.html在具有相同运行时表示的类型之间进行转换:
func :: String -> String
func = ...
...
funcWrapper :: StringWrapper1 -> StringWrapper2
funcWrapper = coerce func
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)