Ошибка разбора с использованием переменных типа с лексической областью в Haskell - PullRequest
1 голос
/ 19 августа 2011

Когда я отправляю в GHC код

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, ScopedTypeVariables #-}


class Modular s a | s -> a where modulus :: s -> a



newtype M s a = M {unM :: a} deriving (Eq, Show)



normalize :: (Modular s a, Integral a) => a -> M s a
normalize x :: M s a = M (x `mod` (modulus (undefined :: s)))

Я получаю следующую ошибку:

config1.hs:10:1: Parse error in pattern: normalize

Можешь помочь?

Эрик Маколей

Ответы [ 2 ]

7 голосов
/ 19 августа 2011
normalize x :: M s a = -- ...

Это просто неправильно. Нет смысла объявлять тип возвращаемого значения в таком определении, вы уже объявили его в сигнатуре типа в строке ранее. И на самом деле это не является синтаксически допустимым и причиной, по которой вы получаете ошибку разбора.

Однако, как только вы исправите ошибку разбора (удалив :: M s a), она все равно не будет работать, потому что вы еще не используете переменные типа scoped:

Чтобы использовать расширение переменных типа scoped, необходимо явно объявить переменные типа с помощью ключевого слова forall. Фиксированное определение будет выглядеть так:

normalize :: forall s a. (Modular s a, Integral a) => a -> M s a
normalize x = M (x `mod` (modulus (undefined :: s)))
4 голосов
/ 19 августа 2011

Я думаю, что вы хотите это:

normalize :: forall s a . (Modular s a, Integral a) => a -> M s a
normalize x = M (x `mod` (modulus (undefined :: s)))

Обратите внимание на forall s a., которые приводят переменные типа s и a в области видимости в теле функции при использованииScopedTypeVariables языковая функция.

Синтаксис, который вы пробовали, никогда не поддерживался GHC.

...