【发布时间】:2013-02-05 15:24:19
【问题描述】:
所以在 Haskell 中有一个名为 spoon 的库,可以让我这样做
safeHead :: [a] -> Maybe a
safeHead = spoon . head
但它也让我这样做
>>> spoon True :: Maybe Bool
Just True
>>> spoon (error "fork") :: Maybe Bool
Nothing
>>> spoon undefined :: Maybe Bool
Nothing
>>> spoon (let x = x in x) :: Maybe Bool
<... let's just keep waiting...>
这在某些情况下似乎非常有用,但它也违反了指称语义(据我的理解),因为它让我能够区分⊥ 的语义原像中的不同事物。这比throw/catch 更强大,因为它们可能具有由延续定义的语义。
>>> try $ return (error "thimble") :: IO (Either SomeException Bool)
Right *** Exception: thimble
所以我的问题是:有人可以恶意使用勺子来破坏类型安全吗?便利值得冒险吗?或者,更现实地说,是否有合理的方式使用它会削弱人们对程序含义的信心?
【问题讨论】:
-
你说什么危险?一个纯粹主义者可能会因恐惧而退缩?
-
@RobertHarvey 可能不会有任何危险,但您经常会发现违反纯度会导致对绕过模块封装的行为或技巧的错误预期。我非常乐意在实际代码中使用
spoon(我已经这样做了),但我今天注意到它违反了 Haskell 语义。 -
你真的能这样区分
undefined和(let x = x in x)吗?如果您等待的时间足够长,也许后者确实会返回Nothing。 -
@SjoerdVisscher:我查过了,没有。
-
注意:如果你喜欢使用像
Maybe a这样的返回类型而不是部分函数,safe package 可能更适合你。
标签: haskell