According to my understanding, partial functions are functions that we get by passing fewer parameters to a function than expected. For example, if this were directly valid in Python:
>>> def add(x,y):
... return x+y
...
>>> new_function = add(1)
>>> new_function(2)
3
Run Code Online (Sandbox Code Playgroud)
In the snippet above, new_function is a partial function. However, according to the Haskell Wiki, the definition of partial function is
A partial function is a function that is not defined for all possible arguments of …
python haskell functional-programming partial-application partial-functions
这是我在调用Haskell子字符串函数时为什么会得到"函数中的非详尽模式..."的后续内容?
据我所知,使用-WallGHC可以警告不详尽的模式.我想知道在默认情况下没有使它成为编译时错误的原因是什么,因为它始终可以显式定义部分函数:
f :: [a] -> [b] -> Int
f [] _ = error "undefined for empty array"
f _ [] = error "undefined for empty array"
f (_:xs) (_:ys) = length xs + length ys
Run Code Online (Sandbox Code Playgroud)
问题不是针对GHC的.
是因为......
haskell functional-programming non-exhaustive-patterns partial-functions
take (-1) []是[].
在部分功能上更喜欢这个的原因是什么,即错误?
是否存在利用此属性的用例?
由于总函数是部分函数的特例,我想我应该能够在需要部分函数时返回函数.
例如,
def partial : PartialFunction[Any,Any] = any => any
Run Code Online (Sandbox Code Playgroud)
当然这种语法无法编译.我的问题是,是否可以这样做,如果是这样,我需要做什么才能使语法正确.
我知道我可以做到以下几点,但这只是一个过于好奇的问题
def partial : PartialFunction[Any,Any] = {
case any => any
}
Run Code Online (Sandbox Code Playgroud) 如何在以下声明中确定头部和尾部:
val head::tail = List(1,2,3,4);
//head: 1 tail: List(2,3,4)
Run Code Online (Sandbox Code Playgroud)
不应该有一些代码将第一个元素提取为head并将尾部作为新List返回.我一直在梳理Scala标准库代码,但我找不到/理解这是怎么做的.
到目前为止,我已经看到了某些部分函数的许多“可能”版本,这些函数可能会导致 \xe2\x8a\xa5,例如readMaybeforread和listToMaybefor head; 有时我想知道我们是否可以概括这个想法并制定这样一个函数,safe :: (a -> b) -> (a -> Maybe b)将任何部分函数转换为更安全的完整替代方案,该替代方案Nothing在原始函数中调用错误堆栈的任何实例上返回。到目前为止,我还没有找到实现此类safe功能的方法或类似类型的现有实现,我开始怀疑这个想法是否真正可行。
所以,我把这个函数叫做tryMap,如下所示:
/// tryMap, with failure and success continuations.
let rec tryMapC : 'R -> ('U list -> 'R) -> ('T -> 'U option) -> ('T list) -> 'R =
fun failure success mapping list ->
match list with
| [] -> success []
| head::tail ->
match mapping head with
| None -> failure
| Some result ->
let success = (fun results -> result::results |> success)
tryMapC failure success mapping tail
/// <summary>
/// Attempts to map a list …Run Code Online (Sandbox Code Playgroud) 根据Haskell维基,scanl1功能是部分的.不过,我不明白输入结果是什么.对于列表函数,我习惯于问题输入是空列表(如for head)或无限列表(如for reverse).但是,scanl1似乎正确处理这两种类型的列表.这实际上是部分功能吗?如果是这样,那么输入的一个例子是什么?
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
我不明白为什么使用变量作为临时值会使部分函数不同:
val f1: PartialFunction[Option[Int], Int] = { b =>
val i = identity(b)
i match {
case Some(res) => res
}
}
val f2: PartialFunction[Option[Int], Int] = { b =>
identity(b) match {
case Some(res) => res
}
}
f1.isDefinedAt(None)
f2.isDefinedAt(None)
Run Code Online (Sandbox Code Playgroud)
Scala 2.13.12 和 Scala 3.3.1 的结果是true/ 。false第一个版本显示匹配详尽性警告,第二个版本则没有。该代码无法使用 Scala 2.12.18 编译,错误出现在第一个版本中:
类型不匹配;
找到:选项[Int] => Int
必需:PartialFunction[Option[Int],Int]
第二个版本怎么比第一个版本更“偏颇”呢?