小编Gur*_*ngh的帖子

Scala在Haskell中的部分函数

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

haskell scala partial-functions

4
推荐指数
1
解决办法
196
查看次数

时间限制函数,在Haskell中具有部分结果

给出初始值(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)

haskell timeout

2
推荐指数
1
解决办法
105
查看次数

标签 统计

haskell ×2

partial-functions ×1

scala ×1

timeout ×1