2012-02-19 3 views
4

Например, у меня есть следующие функции:"Где тип функции в Haskell

foo :: t -> f 
foo var = foo' b var 
    where 
     b = bar 0.5 vect 

и мне нужно указать литералов 0.5 типа -„т“

Если я пишу л. например, (0.5::t), GHC создает новую переменную типа 't0', которая не соответствует оригинальному 't'.

Я написал небольшую функцию

ct :: v -> v -> v 
ct _ u = u 

и использовать его как это:

b = bar (ct var 0.5) d 

Есть ли лучшее решение?

+0

Там есть опция компилятора, что позволит вам сказать '(0,5 :: гр)' и он будет соответствовать 't' окружающему пространству' t', но я забываю, что это такое. –

+1

вы написали очень мало информации - например, что такое бар, соответственно, подпись типа бара и foo '. поскольку я понимаю, что строчные буквы - это заполнители для ghc, которые должны быть выведены. известные типы начинаются с прописной буквы типа «Float» или «Int», поэтому вы не передаете почти никакой информации о типе компилятору, который запрашивает дополнительную информацию. – epsilonhalbe

+0

, если вы попытаетесь загрузить файл с помощью 'ghci', интерпретатор все еще терпит неудачу, поскольку я помню, что это менее строго. Кроме того, вы можете узнать о типе функции ': t foo' – epsilonhalbe

ответ

8

Вы можете использовать ScopedTypeVariables для того, чтобы переменные типа из подписи верхнего уровня в области видимости,

{-# LANGUAGE ScopedTypeVariables #-} 

foo :: forall t. Fractional t => t -> f 
foo var = foo' b var 
    where 
    b = bar (0.5 :: t) vect 

Ваша вспомогательная функция ct есть - с перевернутых аргументами - уже в Prelude,

ct = flip asTypeOf 

так

where 
    b = bar (0.5 `asTypeOf` var) vect 

будет работать в о.

+0

Спасибо, именно то, что мне нужно! –

1

Без ScopedTypeVariables обычным решением является переписать b в функцию, такую, что она принимает тип t и возвращает что-то типа t. Таким образом, его t является общим и независимым от внешнего t и может быть выведен на основании того, где он используется.

Однако, не зная тип вашей foo' и bar и т.д., я не могу вам сказать, что именно это будет выглядеть

Смежные вопросы