2016-06-29 72 views
-2

Im新的斯卡拉,但我知道一些功能編程感謝Haskell和我正在尋找一些例子,你能告訴我這將是如何在斯卡拉?Haskell to Scala

scalarProduct :: [Int] -> [Int] -> Int 
scalarProduct [] _ = 0 
scalarProduct _ [] = 0 
scalarProduct (x:xs) (y:ys) = if length(xs) == length (ys) then x*y + scalarProduct xs ys else 0 

lessThan :: [Float] -> Float -> Int 
lessThan [] _ = 0 
lessThan (x:xs) n = if x < n then 1 + lessThan xs n else lessThan xs n 


removeLast :: [a] -> [a] 
removeLast [] = [] 
removeLast (x:xs) = if length(xs) == 0 then [] else [x] ++ removeLast xs 


funcion :: Int -> Float 
funcion x | x >= 6 = fromIntegral(product[9..x*2]) 
      | x > 0 = fromIntegral(x) ** (1/4) 
      | x <= 0 = fromIntegral(product[1..(-x)]) * 5.0**fromIntegral(x) 
+1

我會從這裏開始看這裏http://docs.scala-lang.org/cheatsheets/它的一個相當不錯的快速參考指南,如果這就是你感興趣的。 – user1875195

+1

不要試圖通過翻譯來學習一門語言從另一個:你可能會產生非慣用代碼。是的,一些Haskell模式可以被翻譯,但是我會從一開始就從Scala教程開始。 – chi

+0

'removeLast'可以用'init'完成。即'List(1,2,3).init'是'List(1,2)'。 – Brian

回答

2

如果你想要字面轉換,我認爲下面是儘可能接近你會得到。請記住,你必須把它放在一個對象/類/特性中,以便編譯(或者只是將它放到REPL中)。

def scalarProduct(list1: List[Int], list2: List[Int]): Int = (list1,list2) match { 
    case (Nil,_) => 0 
    case (_,Nil) => 0 
    case (x :: xs, y :: ys) => if (xs.length == ys.length) x*y + scalarProduct(xs,ys) else 0 
} 

def lessThan(floats: List[Float], bound: Float): Int = floats match { 
    case Nil => 0 
    case x :: xs => if (x < bound) 1 + lessThan(xs,n) else lessThan(xs,n) 
} 

def removeLast[A](list: List[A]): List[A] = list match { 
    case Nil => Nil 
    case x :: xs => if (xs.length == 0) Nil else List(x) ++ removeLast(xs) 
} 

def funcion(x: Int): Double = { 
    if (x >= 6) 
     (9 to x*2).product 
    else if (x > 0) 
     Math.pow(x,0.25) 
    else 
     (1 to -x).product.toDouble * Math.pow(5.0,x) 
} 

這段代碼非常類似於Scala。例如,執行前三個的Scala方式可能會使用隱式轉換類RichList[A]。而且,使用庫函數可以更簡單地完成這些操作 - 但我不認爲這就是您要查找的內容(否則您會使用Haskell代碼的相應庫函數)。