2016-06-29 10 views
-2

ImはScalaには初めてですが、Haskellのおかげで関数型プログラミングに関することが分かりました。私はいくつかの例を探していますが、これがScalaの仕組みを教えてください。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

リテラル変換が必要な場合は、次のように近いと思います。コンパイルするには、これをオブジェクト/クラス/特性の中に入れなければならないことに注意してください。

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のようなものではありません。たとえば、最初の3つを実行するScalaの方法は、おそらく暗黙的な変換クラスRichList[A]で行われます。また、これらはすべてライブラリ関数を使ってはるかに簡単に行うことができますが、それはあなたが探しているとは思いません(そうでなければ、Haskellコードに対応するライブラリ関数を使用したでしょう)。