如何编写一个以Int
作为输入的函数,如果Int
则返回> 0
,否则返回短划线"-"
< 0
{{1}} 1}}。我知道Haskell对它的类型很严格,但有没有办法实现呢?
答案 0 :(得分:8)
Haskell是静态类型的,这意味着通常您无法根据运行时内容更改类型。
但您可以使用Either
类型:
Either
data Either a b = Left a | Right b
定义为:
{{1}}
您可以稍后在程序中查询您是在处理左构造函数还是正确的构造函数。
答案 1 :(得分:6)
我认为Haskell的做法是使用Maybe
。
positive :: Int -> Maybe Int
positive x | x >= 0 = Just x
| x < 0 = Nothing
然后,您可以模式匹配,看看您是否有Just
或Nothing
。否则,没有办法编写一个能说你所说的函数 - 它的签名是什么:Int -> Int
或Int -> String
?
答案 2 :(得分:5)
haskell中的函数需要返回单个类型。你可以争论这是否有益(参见this Programmers.SE post)但是如果不深入研究语言中更复杂的部分,那么你必须要处理它。
就像评论中提到的@pdexter和答案中提到的@Alec一样,Maybe
是解决这个问题的最好方法。
import Data.Maybe
...
f :: Int -> Maybe Int
f num
| x >= 0 = Just num
| x < 0 = Nothing
然后在您的其他代码中,您可以处理Maybe
:
-- Let's assume you want to bind the result to a String type
let num = f Number
putStrLn $ case num of
Just x -> show x
Nothing -> "-"