【发布时间】:2018-06-13 20:50:16
【问题描述】:
Scala 对偏函数有很好的支持,主要是因为在 Scala 中,当您定义偏函数时,它还为它定义了一个 isDefinedAt 函数。 Scala 也有 orElse 和 andThen 函数来处理部分函数。
Haskell 确实通过简单地非详尽地定义一个函数来支持部分函数(尽管在 Haskell 社区中强烈反对它们)。但是要定义isDefinedAt 函数,你必须使用某种异常处理,我无法弄清楚。一旦定义了isDefinedAt 函数,就可以使用它来定义orElse 和andThen 函数已经存在为(.)。
总之,我要定义一个函数,
isDefinedAt :: (a -> b) -> a -> Bool
isDefinedAt f x = -- returns True if f is defined at x else False
谁能告诉我如何编写这样的函数。
注意,我可以定义一个带有签名的函数
isDefinedAt :: (a -> b) -> a -> IO Bool
对于通用b。但是我想要一个没有 IO 的功能在共同域中。
一篇关于 Scala 部分函数的好文章是 - How to create and use partial functions in Scala By Alvin Alexander
【问题讨论】:
-
“定义”是指“不是
undefined”吗?为什么不直接使用Maybe? -
根据设计,如果不使用
IO,就无法在 Haskell 中捕获异常。正如您所说,强烈建议不要使用偏函数;如果你编写一个部分函数,你应该考虑你的责任,以确保它永远不会在其域之外被调用。如果不能预先保证,您应该明确说明该函数可以通过合适的结果类型失败。 -
@leftaroundabout 我知道并完全理解你在说什么,但这种对部分函数的消极态度对我来说似乎有点教条。使用偏函数有充分的理由,例如头函数和尾函数。并且在许多此类情况下在共同域中使用 Maybe 似乎并不诚实,因为当有人想到 head 函数时,他/她认为它是一个未在空列表中定义的函数,所以我确实希望我的程序在我崩溃时崩溃要求她计算“head []”,错误提示它没有定义,最好是。
标签: scala haskell partial-functions