我正在修改我在Haskell上的测试,其中一个问题是:
(b)给出类型声明以完成以下(可能是不完整的)函数定义:
II。
unzOp ((x,y):zs) = ((x+1):(fst(unzOp zs)),(y+2.5):(snd(unzOp zs)))
有人可以帮我回答这个问题吗?如果您可以分析为什么答案是什么,那么将非常感激。
谢谢
答案 0 :(得分:2)
首先,您必须确定"形状"数据的。你可以通过寻找构造函数来做到这一点。
这里有(:)
,list的构造函数和(,)
,元组的构造函数。
您可以推断出类型具有形状
unzOp :: [(a, b)] -> ([a], [b])
然后,您可以在a
和b
上查找更多约束。
由于x+1
,您必须假设x
是一个数字。
由于y+2.5
,您必须假设y
也是一个数字,但是小数。
所以,
unzOp :: (Num a, Fractional b) => [(a, b)] -> ([a], [b])
老实说,数字类型不是Haskell中最简单的东西。
您可以在ghci中使用:t
来询问表达式的类型。
:t (\x -> x + 1)
(\x -> x + 1) :: Num a => a -> a
顺便说一句,如果将空列表传递给unzOp
会发生什么?
或者换句话说,unzOp
是递归定义的,但基本情况是什么?