2011-03-24 64 views
1

我有一个功能first类型:Int -> [a] -> (Error ([a],[a]))和第二功能second类型:[a] -> [a] -> [a]哈斯克尔误差函数

我试图让第三函数现在使用上述功能。 类型我有这个功能是:[Int] -> [a] -> Error [a]

我已经给这些类型来解决这个问题,所以不能改变它们。

这是我的尝试:

last :: [Int] -> [a] -> Error [a] 
last (x:xs) list = second (first x list) 

你能从在别人使用误差函数功能通过输出?

+4

函数名称必须小写。你有没有尝试过实施这个? – 2011-03-24 15:43:07

+0

@Joel你可以使用大写名称的函数。它们也被称为*数据构造函数*(好吧,也许函数式的值)。例如。 '只要:: a - >也许a''。 – 2011-03-24 15:44:55

+2

我明白数据构造函数是大写的,但'F'和'Q'不是数据构造函数。 – 2011-03-24 15:47:27

回答

3

假设Errorerror monad,可以使用一元bind操作符(>>=)和uncurry功能:从功能

z (x:xs) list = F x list >>= return . uncurry Q 

uncurry变换Q随两个参数(又名一个咖喱函数)成一个函数成对。这意味着uncurry Q :: ([a], [a]) -> [a]

绑定运算符从monad中取出一个值并将其传递给monadic函数。在这里,我们提取由F返回的Error monad的值,并将其传递给Q,现在变成可用于一对列表的单目函数,这归功于returnuncurry

+1

您也可以使用函子实例:'z(x:_)list = uncurry Q <$> F x list' – fuz 2011-03-24 20:14:14

+0

@FUZxxl谢谢!我知道有一种方法可以编写'fmap(uncurry Q)(F x list)',看上去没有括号的优雅。我不记得运营商是什么。我猜我的哈斯克尔正在生锈:( – 2011-03-24 20:37:03

+0

@Marthino Fernandes:问题是,Prelude默认情况下不会导出'<$>'。 – fuz 2011-03-24 20:42:48