Haskell - 给出类型函数声明

时间:2017-02-19 14:12:47

标签: function haskell types functional-programming

我正在修改我在Haskell上的测试,其中一个问题是:

  

(b)给出类型声明以完成以下(可能是不完整的)函数定义:

     

II。 unzOp ((x,y):zs) = ((x+1):(fst(unzOp zs)),(y+2.5):(snd(unzOp zs)))

有人可以帮我回答这个问题吗?如果您可以分析为什么答案是什么,那么将非常感激。

谢谢

1 个答案:

答案 0 :(得分:2)

首先,您必须确定"形状"数据的。你可以通过寻找构造函数来做到这一点。 这里有(:),list的构造函数和(,),元组的构造函数。 您可以推断出类型具有形状

unzOp :: [(a, b)] -> ([a], [b])

然后,您可以在ab上查找更多约束。 由于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是递归定义的,但基本情况是什么?