2016-02-26 92 views
1

聲明:我是新來的Scala。使用默認參數類型處理scala函數,就好像它沒有默認參數

我想通過使用默認參數的函數,就好像它的類型沒有默認參數

import scala.util.hashing.MurmurHash3 

type Record = Map[String, String] 
type Dataset = Seq[Record] 

def dropDuplicates(dataset: Dataset, keyF: Record => Any = recordHash) : Dataset = { 
    // keep only distinct records as defined by the key function 
    // removed method body for simplicity 
    return dataset 
} 

def recordHash(record: Record, attributes: Option[Seq[String]] = None) : Int = { 
    val values : Seq[String] = attributes 
    .getOrElse(record.keys.toSeq.sorted) 
    .map(attr => record(attr)) 
    return MurmurHash3.seqHash(values) 
} 

下面是我在編譯時得到的錯誤:

error: type mismatch; 
[ant:scalac] found : (Record, Option[Seq[String]]) => Int 
[ant:scalac] required: Record => Any 
[ant:scalac] def dropDuplicates(dataset: Dataset, keyF: Record => Any = recordHash) : Dataset = { 

直覺,我當沒有提供默認參數attributes時,將recordHash視爲Record => Int類型。有沒有辦法將作爲Record => Int類型?

+0

記住scala並不需要顯式的'return',函數的最後一個語句將被返回。 –

+0

在Scala中是隱含的。我沒有太多的Python經驗,所以我不會猜到。 –

回答

2

我無法編譯您的代碼,因爲我錯過了一些類型,但我認爲這會起作用。

def dropDuplicates(dataset: Dataset, keyF: Record => Any = recordHash(_)) : Dataset = { 
    // keep only distinct records as defined by the key function 
} 

這工作,因爲recordHash(_)相當於x => recordHash(x),這樣x(函數的輸入)爲Record這是你想要的類型。

+0

已更新的問題(希望)編譯 –

+0

'recordHash(_)'工作:) –

+1

在此上下文中使用下劃線有什麼用?你能提供一個關於這個背後的直覺的簡單解釋,或者是一些關於下劃線如何實現這個文件的鏈接的鏈接? –