我正在阅读《第一原理的Haskell编程》 一书,newtype
章中有一个练习,要求我为{{1}创建一个TooMany
实例}。
在此之前的练习已经为(Num a, TooMany a) => (a, a)
,TooMany
,Int
和Goats Int
制作了(Int, String)
个实例。我已经完成了这些操作,但没有完成(Int, Int)
。
所有代码如下:
(Num a, TooMany a) => (a, a)
我应该如何更改最后两个表达式以使其起作用?
我还提到了以下问题,但仍未找到答案:
答案 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}}首先是要避免实例问题重叠。