2015-04-08 3 views
3

У меня есть функция Haskell, которую я пытаюсь преобразовать в Scala.Haskell Тип функции Подпись в Scala

В Haskell у вас есть функция, как:

trifecta :: (a->b) -> (b->c) -> (c->d) -> a -> d 

Я не нашел ничего в Интернете о преобразовании этих видов типа подписи в Scala.

Это то, что я сделал до сих пор, но я не совсем уверен, что это правильно.

Scala Код:

def trifecta[A,B,C,D](a: (A=>B), b: (B=>C), c: (C=>D), d: A): D = { 

    trifecta(a, b, c, d) 
} 

Я бы очень признателен, если вы, ребята могли бы мне помочь прояснить этот вопрос. Спасибо!

ответ

6

Ваши типы прекрасны, но ваша реализация не прекратится. Вы, вероятно, имел в виду:

def trifecta[A,B,C,D](a: A=>B, b: B=>C, c: C=>D, d: A): D = c(b(a(d))) 

, если вы хотите, чтобы дубления, как версия Haskell вам нужны отдельные списки аргументов:

def trifecta[A,B,C,D](a: A=>B)(b: B=>C)(c: C=>D)(d: A): D = c(b(a(d))) 
+0

Допустим, я хочу, чтобы выполнить код с 'тройной выигрыш ((+1) , (+3), (+4), 8) '. Почему я получаю ошибки? Я хочу, чтобы функция выполняла три функции и переменную. – rribeiro

+2

@rribeiro - Scala не поддерживает такие разделы, как '+ 1' в Haskell. Вы можете предоставлять функции, но средство проверки типов не может выводить типы аргументов без какого-либо окружающего контекста. Вы можете сделать 'trifecta ((i: Int) => i + 1, (i: Int) => i + 3, (i: Int) => i + 4, 8)' – Lee

+0

Спасибо, за помощь! – rribeiro