2015-12-17 63 views
1

myMap應該帶兩個curried函數。 1)通用列表 2)評估List的每個元素的函數。在Scala中實現MyMap(高階函數)

將函數應用於每個元素後,myMap的返回值爲List。

def myMap (f: Int=>Int) (L:List[Int]) : List[Int] = 
    { 
     var xx = L 
     if(L.isEmpty) Nil 
     val (head::tail) = xx 
     f(head) :: myMap (f) (tail) 
    } 

它給了我不變的警告。

+0

DEF MYMAP(F:INT =>內部)(L:列表[INT]):列表[INT] = { 變種XX = L 如果(L.isEmpty)無 VAL(頭::尾巴)= xx f(head):: myMap(f)(tail) } – Sagar0921

+0

1 - 沒有理由創建'xx'。只需使用'L'。 (除非你應該避免使用國會大廈字母變量名。)2 - 你的'if'語句沒有'else'子句,所以所有的代碼都會被執行,無論L是否爲空。 – jwvh

+1

3)不要通過提問SO –

回答

0

這是一個可行的解決方案

def myMap(f: Int => Int)(list: List[Int]): List[Int] = { 
    list match { 
    case Nil => Nil 
    case head :: tail => 
     f(head) :: myMap(f)(tail) 
    } 
} 

你的代碼(除了格式化)的問題數。

,不要使用大寫字母瓦爾斯

var是沒有意義的,你永遠不會修改它,這種分配是沒用反正,你可以簡單地使用你的論點。

你如果需要的東西,otherways不會magicly返回Nil

你可以用通用型取代int此函數通用

def myMap[A](f: A => A)(list: List[A]): List[A] = { 
    list match { 
    case Nil => Nil 
    case head :: tail => 
     f(head) :: myMap(f)(tail) 
    } 
} 

爲了讓您若其他解決方案的工作,你可以做到這一點:

def myMap[A](f: A => A)(list: List[A]): List[A] = { 
    if (list.isEmpty) { 
    Nil 
    } else { 
    val (head :: tail) = list 
    f(head) :: myMap(f)(tail) 
    } 
} 
+0

非常感謝。它工作完美。 – Sagar0921

0

如果您添加缺少的封鎖其他

您的解決方案會工作3210
def myMap (f: Int=>Int) (L:List[Int]) : List[Int] = { 
    var xx = L 
    if(L.isEmpty) Nil 
    else { 
    val (head::tail) = xx 
    f(head) :: myMap (f) (tail) 
    } 
}