2016-09-18 3 views
1

Супер базовый вопрос - но я не могу получить четкий ответ. Функция внизу не скомпилируется:Основные типы функций Haskell?

randomfunc :: a -> a -> b 
randomfunc e1 e2 
    | e1 > 2 && e2 > 2  = "Both greater" 
    | otherwise    = "Not both greater" 

main = do 
    let x = randomfunc 2 1 
    putStrLn $ show x 

Я смущен, почему это не сработает. Оба параметра - это тип 'a' (Ints), а возвращаемым параметром является тип 'b' (String)?

Ошибка:

"Couldn't match expected type ‘b’ with actual type ‘[Char]’" 

ответ

7

Не совсем. Ваша функция подписи указывает: для всех типов a и b, randomfunc будет возвращать что-то типа b если даны две вещи типа a.

Однако randomFunc возвращает String ([Char]). А так как вы сравните e1 с 2 друг с другом, вы не можете использовать всеa «с, только те, которые могут быть использованы с >:

(>) :: Ord a => a -> a -> Bool 

Обратите внимание, что e1 > 2 также нуждается способ создания такого в a от 2:

(> 2) :: (Num a, Ord a) => a -> Bool 

Так как использовать определенный тип, или убедитесь, что вы обрабатывать все эти ограничения правильно:

randomfunc :: Int -> Int -> String 

randomFunc :: (Ord a, Num a) => a -> a -> String 
2

Both parameters are type 'a' (Ints) and the return parameter is type 'b' (String)?

В сигнатуре типа Haskell, когда вы пишете имена, начинающиеся со строчной буквой, такой как a, компилятор неявно добавляет forall a. к началу типа. Таким образом, это то, что компилятор на самом деле видит:

randomfunc :: forall a b. a -> a -> b 

Тип подписи утверждает, что ваша функция будет работать на то, что («для всех») типов a и b абонент бросает на вас. Но это не относится к вашей функции, поскольку она работает только на Int и String соответственно.

Вы должны сделать свой тип более конкретно:

randomfunc :: Int -> Int -> String 

С другой стороны, возможно, вы хотели, чтобы попросить компилятор заполнить a и b для вас автоматически, а не утверждать, что он будет работать для всех a и b. В таком случае, что вы действительно ищете, PartialTypeSignatures особенность:

{-# LANGUAGE PartialTypeSignatures #-} 

randomfunc :: _a -> _a -> _b 
Смежные вопросы