Я немного в недоумении, почему последний рисунок в prodV в следующем не работает:возвращение типа GADT оценщика
{-# LANGUAGE GADTs #-}
data V a where
V0 :: Float -> V Float
Vn :: [Float] -> V [Float]
prodV :: (Num a) => V a -> V a -> a
prodV (V0 x) (V0 y) = x * y
-- prodV (Vn x) (Vn y) = zipWith (*) x y -- this one works
prodV (Vn xs) (Vn ys) = [ sum $ zipWith (*) xs ys ]
prodV (V0 n) (Vn ys) = map (* n) ys
GHCi 7.8.3 жалуется:
Couldn't match type ‘Float’ with ‘[Float]’
Inaccessible code in
a pattern with constructor
Vn :: [Float] -> V [Float],
in an equation for ‘prodV’
In the pattern: Vn ys`
Любые указатели? заранее заблаговременно
С одной стороны, вы ожидаете, что ваша функция 'prodV' будет работать для всех типов' Num', но конструкторы 'V0' и' Vn' специально содержат 'Float'. Во-вторых, вы говорите, что 'a' в' V a' должен быть 'Num', но' Num a => [a] 'не является экземпляром' Num'. Похоже, вы приближаетесь к этой проблеме неправильно. – bheklilr
Вы, безусловно, можете написать функцию типа 'unV :: V a -> a', которая просто разворачивает конструкторы, но предпосылка вашей функции неверна. Возможно, вам стоит рассмотреть 'Vn :: [Float] -> V Float', но это сделало бы' unV :: V a -> a' невозможным, если вы не конвертируете свой список 'Float' в один' Float' в некоторых мода в первую очередь. – bheklilr
ошибка сохраняется, даже если я удалю ограничение Num; Я не совсем понимаю, почему конструкторы V0 и Vn не могут быть «смешанными». – ocramz