Purescript 中匿名函数的类型问题

Type issues with anonymous functions in 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

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

我怀疑你要写的是

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

foldl 的参数是一个函数,它有两个参数 acci 并且 returns 应用程序 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 的括号不正确。