Haskell只允许正输入

Haskell只允许正输入,haskell,Haskell,我需要定义一个haskell函数: func :: Int -> Int func 1 = 1 func 2 = 2 func x = x+1 所以它只允许正数。我已经看过一个类似的问题: 并写道: newtype Positive a = Positive a toPositive :: (Num a, Ord a) => a -> Positive a toPositive x | x < 0 = error "number cannot be negat

我需要定义一个haskell函数:

func :: Int -> Int
func 1 = 1
func 2 = 2
func x = x+1
所以它只允许正数。我已经看过一个类似的问题:

并写道:

newtype Positive a = Positive a

toPositive :: (Num a, Ord a) => a -> Positive a
toPositive x
    | x < 0 = error "number cannot be negative"
    | otherwise = Positive x

func :: Positive a -> a
func (Positive n) = n
newtype正a=正a
拓扑正::(数量a,顺序a)=>a->正a
正拓扑x
|x<0=错误“数字不能为负”
|否则=正x
func::正a->a
func(正n)=n
然而,它已经抛出了错误。想法

更新:

示例错误:

*Main> func 1

<interactive>:32:6:
    No instance for (Num (Positive a0)) arising from the literal `1'
    Possible fix: add an instance declaration for (Num (Positive a0))
    In the first argument of `func', namely `1'
    In the expression: func 1
    In an equation for `it': it = func 1
*Main>
*Main>函数1
:32:6:
没有由文字“1”产生的(Num(正a0))的实例
可能的修复方法:为(Num(正a0))添加实例声明
在'func'的第一个参数中,即'1'
在表达式中:func 1
在“it”的方程式中:it=func 1
*Main>

您忘记调用
toPositive
Int
转换为
正数。可以这样说:

func $ toPositive 1
此外,Haskell的一个怪癖是它处理负数文本。为避免与减法运算符混淆,必须将它们括在括号中:

func $ toPositive (-1)

它对我非常有效。您遇到了什么错误?上面的示例错误更新尝试调用
func$toPositive 1
它可以处理正值,但是对于负数,我得到了以下结果:*Main>func$toPositive-1:34:8:无法将
($)的第一个参数中的预期类型
Positive a0'与实际类型
a1->Positive a1'匹配,即
($)的第二个参数中的
toPositive',也就是说
toPositive-1'在表达式中:func$toPositive-1谢谢,是的,这是有效的:)有没有办法避免调用“$toPositive”而只使用“func(-1)”?另外,当我尝试添加“func 0=0”或“func(正0)=0”时,我得到。。。dynprog.hs:9:16:没有因文本
0'而产生的(Num a)实例可能的修复方法:将(Num a)添加到模式中func::Positive a->a的类型签名的上下文中:模式中的0在表达式中为
func:func(Positive 0)=2失败,加载的模块:无。您可以编写一个新的
func
,它将
Int
作为参数,并在内部调用toPositive。然而,这开始挫败你所做的事情的目的。如果你创建了一个新的类型,你必须转换成这个类型。您也可以完全删除<代码>积极< /COD>类型,并且在“代码> FUNC
中明确地检查否定输入。我已经尝试过这样做,但是当我尝试返回一个错误时,我得到一个错误,称一个“int”被认为是一个返回类型。如果您的问题变得更大,请考虑对您的问题进行另一个编辑,发布更多的代码,更全面地解释您试图做的事情,以及您遇到的错误。评论是一种低效的谈话方式。