Haskell:有时返回函数的函数

标签 haskell types functional-programming

如何编写一个可以返回值或另一个函数的函数?

例如:

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/

相关文章:

dll - 在 Windows 中分发基于 wxHaskell 的应用程序

haskell - Haskell 数据类型中的类型类

haskell - 是否有可能在 Haskell 中获得类型构造函数的类型?

list - 删除重复项但保留顺序

design-patterns - 何时在具体类中隐藏继承层次结构?

types - f# Narrow discriminated union in previous pattern matching guard(Control Flow Based Type Analysis)

functional-programming - OCaml 函数 : replace a element in a list

haskell 初学者 - 递归递归

haskell - 我如何读取这个孔错误

arrays - 在 Delphi 中传递类型数组的参数