1

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

手伝ってくれますか?

エリック・マコーレー

4

2 に答える 2

7
normalize x :: M s a = -- ...

これは間違っています。このように定義で戻り値の型を宣言する理由はありません。前の行の型シグネチャで既に宣言しています。実際のところ、構文的に有効ではなく、解析エラーが発生する理由です。

ただし、( を削除して) 解析エラーを修正し:: M s aても、実際にはスコープ型変数をまだ使用していないため、まだ機能しません。

forallスコープ型変数拡張を利用するには、キーワードを使用して型変数を明示的に宣言する必要があります。固定定義は次のようになります。

normalize :: forall s a. (Modular s a, Integral a) => a -> M s a
normalize x = M (x `mod` (modulus (undefined :: s)))
于 2011-08-19T12:22:42.113 に答える
4

あなたが望むのはこれだと思います:

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とスコープを持ち込むことに注意してください。aScopedTypeVariables

あなたが試した構文はGHCでサポートされていません.

于 2011-08-19T12:22:57.027 に答える