Gur*_*ngh 4 haskell scala partial-functions
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
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我如何编写这样的功能.
注意,我可以定义一个带签名的函数
isDefinedAt :: (a -> b) -> a -> IO Bool
Run Code Online (Sandbox Code Playgroud)
对于通用b.但我想在共域中没有IO的功能.
关于Scala的部分函数的一篇很好的文章是 - 如何在Scala中创建和使用部分函数Alvin Alexander
Dan*_*ner 12
我建议像Scala一样,为部分函数使用单独的类型.
import Control.Arrow
import Data.Maybe
type Partial = Kleisli Maybe
isDefinedAt :: Partial a b -> a -> Bool
isDefinedAt f x = isJust $ runKleisli f x
-- laziness should save some of the work, if possible
orElse :: Partial a b -> Partial a b -> Partial a b
orElse = (<+>)
andThen :: Partial a b -> Partial b c -> Partial a c
andThen = (>>>)
Run Code Online (Sandbox Code Playgroud)