在Purescript中键入匿名函数的问题

时间:2015-02-23 19:26:13

标签: functional-programming purescript

我正在通过Purescript By Example教程进行操作,我无法使用左侧折叠来排列类型:

smallestFile' :: [Path] -> Maybe Path
smallestFile' (x : xs) = foldl(\acc i -> smallerFile(acc i) ) Just(x) xs // Error is on this line

smallerFile :: Maybe Path -> Path -> Maybe Path
smallerFile maybeA b = do
  a  <- maybeA
  sa <- size a
  sb <- size b
  if sa > sb then return(b) else return(a)

我收到的错误位于左侧,是

Cannot unify Prim.Function u13116 with Data.Maybe.Maybe

我相信这些类型排成一行,但我不能对这个错误做出正面或反面。

此外,是否可以清除匿名函数语法以便

foldl(\acc i -> smallerFile(acc i) ) Just(x) xs

变得像:

foldl smallerFile Just(x) xs

1 个答案:

答案 0 :(得分:4)

在PureScript中,与Haskell一样,函数应用程序使用空格,并与左侧关联,这意味着f x y z解析为((f x) y) z。当需要重新组合术语时,您只需要括号。看起来你正在尝试使用括号进行功能应用。

我怀疑你想写的是

foldl (\acc i -> smallerFile acc i) (Just x) xs

foldl的参数是一个函数,它接受两个参数acci并返回应用程序smallerFile acc i。这相当于双重应用程序(smallerFile acc) i。首先,我们应用参数acc,然后应用第二个参数i。解析器中函数应用程序的优先规则使这些等价。

此外,Just x需要加括号,因为你所写的内容是

foldl (\acc i -> smallerFile (acc i)) Just x xs

foldl提供了太多参数。

拥有正确的版本后,您会注意到\acc i -> smallerFile acc i等同于\acc -> (\i -> (smallerFile acc) i)。内部函数立即应用其参数i,因此我们可以将其简化为\acc -> smallerFile acc。再次应用此简化,我们得到smallerFile,因此代码变为:

foldl smallerFile (Just x) xs

所以最后唯一的错误是Just x的错误包围。