如何将类型类约束添加到新类型表达式?

时间:2018-10-12 04:09:35

标签: haskell typeclass newtype

我正在阅读《第一原理的Haskell编程》 一书,newtype章中有一个练习,要求我为{{1}创建一个TooMany实例}。

在此之前的练习已经为(Num a, TooMany a) => (a, a)TooManyIntGoats Int制作了(Int, String)个实例。我已经完成了这些操作,但没有完成(Int, Int)

所有代码如下:

(Num a, TooMany a) => (a, a)

我应该如何更改最后两个表达式以使其起作用?

我还提到了以下问题,但仍未找到答案:

Adding class constraints to typeclass instance

Can a typeclass constraint be used in a newtype definition?

1 个答案:

答案 0 :(得分:1)

最小的变化是这样的:

using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Api.Dto;
using CEL.CostCalculator.Api.CalculationResults;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA;
using OpenQA.Selenium.Appium.Windows;
using OpenQA.Selenium.Interactions;
using OpenQA.Selenium.Remote;
using Tests.Fixtures.DataPorts;

[TestClass]
public class CCExcelAddInTests : CCSession
{
    [TestMethod]
    public void EditorEnterText()
    {
        Assert.AreEqual("Book1 - Excel", session.Title);
    }

    [ClassInitialize]
    public static void ClassInitialize(TestContext context)
    {
        Setup(context);
    }

    [ClassCleanup]
    public static void ClassCleanup()
    {
        TearDown();
    }
}

关于此实例的两点说明:由于对instance (Num a, Ord a, TooMany a) => TooMany (a, a) where tooMany (t1, t2) = (t1 + t2) > 44 的调用,我不得不添加Ord约束,而(>)约束是多余的,因为实现不调用{{1 }},并以TooMany作为参数。我怀疑预期的锻炼解决方案对tooMany方法的实现略有不同-我鼓励您尝试找到一种使用a约束而不使用tooMany的方法来实现此方法约束!

对于您的TooMany a,正确的语法是这样的:

Ord a

您需要删除newtype的{​​{1}}实例,此语法才能正常工作,否则在派生过程中会有重叠的实例可供选择。但是,我希望预期的练习解决方案是在假设newtype YetAnotherTooMany a = YetAnotherTooMany (a, a) deriving (Eq, Show, TooMany) 实例根本不存在的前提下,自己为此(Int, Int)编写实例,因为大概的目标是学习如何使用{ {1}}首先是要避免实例问题重叠。