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
的参数是一个函数,它有两个参数 acc
和 i
并且 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
的括号不正确。
我正在学习 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
的参数是一个函数,它有两个参数 acc
和 i
并且 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
的括号不正确。