如何编写一个可以返回值或另一个函数的函数?
例如:
Function Foo (x)
If X = 0 Return "Done"
Else Return a Function that calls Foo(x-1)
最佳答案
在 haskell 中,函数的返回类型只能取决于其参数的类型,并且对于具有多态返回类型的函数,还取决于返回值的使用方式。特别是函数的返回类型不能依赖于参数的值。
换句话说:你不能直接做你想做的事。如果您想返回两种类型之一,通常可以使用 Either a b
类型,该类型定义为 data Either a b = Left a | Right b
,它允许您返回包装在 Left
中的 a
类型的值或包装在 Left
中的 b
类型的值正确
。然后,您可以使用模式匹配以类型安全的方式检索值。
但是,由于在这种情况下,b
的类型必须是无限的,因此这是行不通的,您必须为此定义自己的包装器类型。就像这样:
data MyResult = Str String | Fun ( () -> MyResult)
foo 0 = Str "done"
foo x = Fun (\ () -> foo (x-1))
foo
现在的类型为 Num a => a -> MyResult
。然而,每次调用 foo
时,您都必须进行模式匹配,以查看是否返回了内部包含字符串的 Str 或内部包含函数的 Fun。
另请注意,如果您想返回一个函数而不是一个值以延迟执行,这在 haskell 中没有意义,因为它很懒,并且通常在使用之前不会对其进行评估。
关于Haskell:有时返回函数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3173369/