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
给出初始值(x),函数(f),谓词(p)和时间界限(t).我想在x上重复应用'f'直到它满足'p'.但同时要确保它不超过时间限制.如果时间超过't',它应该返回部分结果,即一对数'n'和'''对'x'应用'f'n次的值,对于它实际执行计算的最大n.
如果放宽部分结果条件,可以轻松编程为 -
import System.Timeout
iter :: a -> (a -> a) -> (a -> Bool) -> Int -> IO (Maybe (Int, a))
iter x f p t = do
let fs = x:(map f fs)
timeout t $ return $! head $ filter (\x -> p $ snd x) $ zip [1..] fs
Run Code Online (Sandbox Code Playgroud)
我希望它的签名类似于 -
iter :: a -> (a -> a) -> (a -> Bool) -> Int -> IO (Either (Int, a) (Int, a))
Run Code Online (Sandbox Code Playgroud)
左侧为部分结果,右侧为完整结果.
使用上述功能的一个愚蠢而微不足道的例子是 -
*Main> …Run Code Online (Sandbox Code Playgroud)