当需要“PartialFunction”时,Scala中是否存在隐含的总函数提升?

时间:2018-04-19 04:06:23

标签: scala

我对错误感到有点困惑

Sub SPO_EditDocument_BUttonClick()

'Declare constant variable
Dim CellValue As String
Dim DelRng As Range

'Edit SPO Documents.
'Consider worksheet"SPO"

Application.ScreenUpdating = False

With Worksheets("Sheet1")

    '1. Loop and delete unnecessary columns
    LastCol = .Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

    For i = 1 To LastCol
        CellValue = .Cells(1, i)   'Get Column header

        Select Case CellValue
            Case "Firstname", "Surname", "DoB", "Gender", "Year"
                If Not DelRng Is Nothing Then
                    Set DelRng = Application.Union(DelRng, .Columns(i))
                Else
                    Set DelRng = .Columns(i)
                End If

            Case Else
                ' Do nothing

        End Select
    Next i

End With  'End to process Worksheets

' if there's at least 1 column in DelRng >> delete the entire range (all columns) in 1-shot
If Not DelRng Is nothign Then DelRng.Delete

Application.ScreenUpdating = True

End Sub

我可以通过包含我在[error] found : A => B [error] required: PartialFunction[A,B] 中使用的函数来解决这个问题,但这看起来像是我期望隐含的the doc's definition"它的部分功能类型PartialFunction [A,B]是一元函数,其中域必然包括类型A和#34的所有值。

使用"必然"这个定义似乎明确地包含一个函数Function.unlift(x => Some(...))A => B。我误读了这个,还是错过了其他的东西?

为了增加我的困惑,我在使用PartialFunction[A, B]Throwable的代码中收到此错误时,我无法使用a simpler example重现该错误。

2 个答案:

答案 0 :(得分:1)

PartialFunction does not necessarily include all values of type A这意味着您只能在没有其他值的情况下处理目标值。比如模式匹配

示例1:

List(1, 2, 3, 4, 5).collect({
    case x if x % 2 == 0 => x + 1
})

在上面的代码段中,我们只想处理偶数数字和加号 1.如果没有PartialFunction,我们需要{ {1}}首先是偶数,再次filter

示例2:

map

在示例2中,我们只想处理列表中的字符串类型值,因此List(1, 2, "one", "two").collect({ case x: String => x + 1 }) 也可用于匹配类型。< / p>

因此,如果您希望PartialFunctionimplicit转换为Function,我认为您可以定义隐式方法,如:

PartialFunction

但似乎 implicit def convertFunctionToPartialFunction[A, B](f: A => Option[B]) = { Function.unlift(f) } val a: Int => Option[Int] = (x: Int) => { if (x % 2 == 0) { Some(x + 1) } else None } val res = List(1, 2, 3, 4, 5).collect(a) a很难看......

答案 1 :(得分:1)

PartialFunction[A, B]A => B的子类型。特别是,它具有isDefinedAt没有的A => B方法。因此,在期望PartialFunction的情况下,不能使用正常函数。

你的&#34;更简单的例子&#34;相反的是:它将PartialFunction传递给需要函数的东西。这个方向很好。

您可以使用

而不是弄乱Function.unlift
{ case x => f(x) }

(因为PartialFunction是您案例中的预期类型)。还有PartialFunction(f), but it's deprecated since 2.12.5