LINUX.ORG.RU

История изменений

Исправление AndreyKl, (текущая версия) :

в общем не уверен верно ли понял задачу, но если верно, то вот, самый «обычный» способ

module Ao where

data Ao = Apple Int | Orange Int

difference :: Ao -> Ao -> String
difference (Apple a)  (Apple b)  | a == b    = "both are apples, weights are equal"
difference (Apple _)  (Apple _)  | otherwise = "both are apples, but weights are different"
difference (Orange a) (Orange b) | a == b    = "both are oranges, weights are equal"
difference (Orange _) (Orange _) | otherwise = "both are oranges, but weights are different"
difference (Apple _) _                       = "first is apple, second is orange"
difference _ _                               = "first is orange, second is apple"

Исходная версия AndreyKl, :

в общем не уверен верно ли понял задачу, но если верно, то вот, самый простой способ

module Ao where

data Ao = Apple Int | Orange Int

difference :: Ao -> Ao -> String
difference (Apple a)  (Apple b)  | a == b    = "both are apples, weights are equal"
difference (Apple _)  (Apple _)  | otherwise = "both are apples, but weights are different"
difference (Orange a) (Orange b) | a == b    = "both are oranges, weights are equal"
difference (Orange _) (Orange _) | otherwise = "both are oranges, but weights are different"
difference (Apple _) _                       = "first is apple, second is orange"
difference _ _                               = "first is orange, second is apple"