根据输入返回字符串或Int

时间:2016-06-28 20:31:50

标签: haskell type-conversion

如何编写一个以Int作为输入的函数,如果Int则返回> 0,否则返回短划线"-" < 0 {{1}} 1}}。我知道Haskell对它的类型很严格,但有没有办法实现呢?

3 个答案:

答案 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

然后,您可以模式匹配,看看您是否有JustNothing。否则,没有办法编写一个能说你所说的函​​数 - 它的签名是什么:Int -> IntInt -> 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 -> "-"