Scala在Haskell中的部分函数

Gur*_*ngh 4 haskell scala partial-functions

Scala对部分函数有很好的支持,主要是因为在Scala中定义部分函数时它也isDefinedAt为它定义了一个函数.而且还Scala有orElseandThen功能与部分职能的工作.

Haskell确实通过简单地非详尽地定义函数来支持部分函数(尽管在Haskell社区中强烈建议不要使用它们).但是为了定义isDefinedAt函数,你必须使用某种异常处理,这是我无法弄清楚的.一旦isDefinedAt定义了函数,它就可以用于定义orElseandThen函数已经存在(.).

简而言之,我想定义一个函数,

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)