Jon*_*len 6 haskell types functional-programming
你如何编写一个可以返回值或其他函数的函数?
例如:
Function Foo (x)
If X = 0 Return "Done"
Else Return a Function that calls Foo(x-1)
Run Code Online (Sandbox Code Playgroud)
sep*_*p2k 21
在haskell中,函数的返回类型只能依赖于其参数的类型,并且在具有多态返回类型的函数的情况下,如何使用返回值.特别是函数的返回类型不能取决于参数的值.
换句话说:你不能直接做你想做的事.在要在其中返回两种类型中的一个的情况下,通常可以在类型Either a b,其定义为data Either a b = Left a | Right b允许,则返回类型的值a包裹在Left或类型的值b裹着Right.然后,您可以使用模式匹配以类型安全的方式检索值.
但是,因为在这种情况下,类型b必须是无限的,这不起作用,你必须为此定义自己的包装类型.像这样:
data MyResult = Str String | Fun ( () -> MyResult)
foo 0 = Str "done"
foo x = Fun (\ () -> foo (x-1))
Run Code Online (Sandbox Code Playgroud)
foo现在有了类型Num a => a -> MyResult.但是每次你打电话foo都要进行模式匹配,看你是否有一个带有字符串的Str或带有函数的Fun.
另请注意,如果要返回一个函数而不是一个值来延迟执行,这在haskell中没有意义,因为它很懒惰,并且在使用它们之前通常不会对它们进行求值.