는 다음의 prodV의 마지막 패턴이 작동하지 않는 이유에 손실에서 약간 내가 해요 :반환 형식은
{-# 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'을 포함합니다. 두 번째로, 'V a'의 'a'는 'Num'이어야하지만 'Num a => [a]'는 'Num'의 인스턴스가 아닙니다. 이 문제를 잘못된 방식으로 접근하고있는 것처럼 보입니다. – bheklilr
"unV :: V a -> a'와 같은 함수를 작성할 수 있습니다. 단순히 생성자를 unwrap하지만 함수의 전제가 정확하지는 않습니다. 어쩌면 당신은'Vn :: [Float] -> V Float'을 고려해야 할 것이지만'Float'의리스트를 하나의'Float'로 변환하지 않으면'unV :: V a -> a'를 불가능하게 만들 것입니다 먼저 패션. – bheklilr
Num 제약 조건을 제거하더라도 오류가 남아 있습니다. 나는 왜 V0와 Vn 생성자가 '혼합'될 수 없는지 잘 모르겠다. – ocramz