我正在通过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
答案 0 :(得分:4)
在PureScript中,与Haskell一样,函数应用程序使用空格,并与左侧关联,这意味着f x y z
解析为((f x) y) z
。当需要重新组合术语时,您只需要括号。看起来你正在尝试使用括号进行功能应用。
我怀疑你想写的是
foldl (\acc i -> smallerFile acc i) (Just x) xs
foldl
的参数是一个函数,它接受两个参数acc
和i
并返回应用程序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
的错误包围。