-1

「ハスケルを学ぶ」のそのトピックに関する章を読み、さまざまな Web サイトでいくつかのヒントを見つけようとしましたが、それでも次のタスクを解決できません。インスタンスをm a haskell newbie (6 weeks of "experience") and it扱うのは初めてです。これがタスクです。私のコードは HUnit テストと終了に合格する必要があります。インスタンスを実装しようとしましたが、そこに何かが欠けているようです。あなたが私を助けてくれることを願っています!THX

module SemiGroup where

{-

A type class 'SemiGroup' is given. It has exactly one method: a binary operation
called '(<>)'. Also a data type 'Tree' a newtype 'Sum' and a newtype 'Max' are
given. Make them instances of the 'SemiGroup' class.
The 'Tree' instance should build a 'Branch' of the given left and right side.
The 'Sum' instance should take the sum of its given left and right side. You need
a 'Num' constraint for that.
The 'Max' instance should take the maximum of its given left and right side. You
also need a constraint for that but you have to figure out yourself which one.
This module is not going to compile until you add the missing instances.

-}

import Test.HUnit (runTestTT,Test(TestLabel,TestList),(~?=))


-- | A semigroup has a binary operation.
class SemiGroup a where
    (<>) :: a -> a -> a

-- Leaf = Blatt, Branch = Ast
-- | A binary tree data type.
data Tree a = Leaf a
            | Branch (Tree a) (Tree a)
                deriving (Eq,Show)


-- | A newtype for taking the sum.
newtype Sum a = Sum {unSum :: a}


-- | A newtype for taking the maximum.
newtype Max a = Max {unMax :: a}

instance SemiGroup Tree where
    (<>) x y = ((x) (y))

instance SemiGroup (Num Sum) where
    (<>) x y = x+y

instance SemiGroup (Eq Max) where
    (<>) x y = if x>y then x else y



-- | Tests the implementation of the 'SemiGroup' instances.
main :: IO ()
main = do
    testresults <- runTestTT tests
    print testresults

-- | List of tests for the 'SemiGroup' instances.
tests :: Test
tests = TestLabel "SemiGroupTests" (TestList [
    Leaf "Hello" <> Leaf "Friend" ~?= Branch (Leaf "Hello") (Leaf "Friend"),
    unSum (Sum 4 <> Sum 8) ~?= 12,
    unMax (Max 8 <> Max 4) ~?= 8])

私は次のようなものを試しました:

class SemiGroup a where
    (<>) :: a -> a -> a

-- Leaf = Blatt, Branch = Ast
-- | A binary tree data type.
data Tree a = Leaf a
            | Branch (Tree a) (Tree a)
                deriving (Eq,Show)


-- | A newtype for taking the sum.
newtype Sum a = Sum {unSum :: a}


-- | A newtype for taking the maximum.
newtype Max a = Max {unMax :: a}

instance SemiGroup Tree where
    x <> y = Branch x y

instance Num a => SemiGroup (Sum a) where
    x <> y = x+y

instance Eq a => SemiGroup (Max a) where
    x <> y = if x>y then x else y

しかし、まだいくつかの失敗が残っています!少なくとも、「chi」が言及したラップ/アンラップのこと。しかし、私にはわかりません。多分別のヒント?:/

4

2 に答える 2

0

種類に注意。手動で、または GHCi の助けを借りて、作成している関数の型を見つけます。型クラスのインスタンスが必要とする型と一致しないことがわかります。ラッピングとアンラッピングを使用して、機能するまで型を調整します。

于 2014-07-04T18:11:02.037 に答える