학습 하스켈 일치 왜 나는이 정의를 주어, 내가 예상 결과를 얻을하지 않는 이유 확실하지 않다 :확실하지 않음이 패턴 가드
instance Ring Integer where
addId = 0
addInv = negate
mulId = 1
add = (+)
mul = (*)
class Ring a where
addId :: a -- additive identity
addInv :: a -> a -- additive inverse
mulId :: a -- multiplicative identity
add :: a -> a -> a -- addition
mul :: a -> a -> a -- multiplication
내가
squashMul :: (Ring a) => RingExpr a -> RingExpr a -> RingExpr a
squashMul x y
| (Lit mulId) <- x = y
| (Lit mulId) <- y = x
squashMul x y = Mul x y
그러나이 기능을 쓴
:
*HW05> squashMul (Lit 5) (Lit 1)
Lit 1
나는 정수에 대해 하나 개의 버전 구체적으로 작성하는 경우 :
,squashMulInt :: RingExpr Integer -> RingExpr Integer -> RingExpr Integer
squashMulInt x y
| (Lit 1) <- x = y
| (Lit 1) <- y = x
squashMulInt x y = Mul x y
그런 다음 예상되는 결과가 나옵니다.
x가 (켜짐 1)이 아니더라도 (Lit mulId) <- x
이 일치하는 이유는 무엇입니까?
'mulId'는 이전에 정의 된 것과 관계없는 새로운 지역 변수입니다. 대신'Lit w <- x, w == mulId = ... '를 원한다. – chi