我不能肯定,我明白这一点:
f :: Integer -> Double -> String -> String
f a d s = undefined
f
的潜在主体在这里会是什么呢?我对这个以前从未遇到过的新语法感到困惑。
**EDIT:**那么,既然a
是Integer
,而d
是Double
,那么方法体是否可以这样写,即根据类型返回String
?就像比较一样。
巨蟒:
def f(a: int, d: float, s: str) -> str:
if(s == "Is Integer less than Double"):
if(a < d):
return "Yes, it is."
else:
return "No, it isn't"
"如何在Haskell做同样的事?"
3条答案
按热度按时间p5cysglq1#
你可以翻译你的Python代码,把语法结构几乎逐字地Map到Haskell。
return
(因为在Haskell中你总是直接指定函数返回什么,并且只需要额外的语法来管理一元副作用--而这个函数没有)。if
语句中有一个else
,因为不像在Python中,你不能 * 不返回任何东西 *(好吧,可以说你在Python中也不能这样做,如果你没有显式地返回其他东西,它只是默认返回None
)。<
,与Python不同,Haskell从不自动进行类型转换,但是你可以显式地使用fromIntegral
。所以,
Haskellers倾向于不使用
if
结构,而是使用 guards 作为条件,即:这实际上也允许您省略显式回退情况,尽管编译器随后会警告不完全匹配。
无论如何这还是不地道的:Haskellers避免绑定一个函数参数来检查它是否相等,相反,你只需要对你要比较的值进行 pattern match:
现在,您实际上可以将guards用于原来的内部
if
:如果你真的不想处理任何其他字符串的情况,那么你应该把它作为一个 failure case,也可以通过类型签名来表达:
dw1jzc5e2#
那么,既然
a
是Integer
,而d
是Double
,那么方法的主体是否可以这样写,即根据类型返回String?就像比较一样。是的,但是有一个小小的警告。**
(<) :: Ord a => a -> a -> Bool
要求两个操作数具有相同的类型,所以我们需要首先将Integer
转换为一个双精度型,我们可以使用fromInteger :: Num a => Integer -> a
**将其转换为Num
类型类中的任何类型。我们可以使用 guards 实现此功能,如下所示:
但是函数不是 total,只有当第三个参数是
"Is Integer less than Double"
时,它才会比较这两个参数。Haskell的程序员倾向于选择对每个 * 可能 * 的输入都返回值的函数,因为这样他们就不必担心传递某些输入。nc1teljy3#
函数的参数列表的这种表示方式就是“函数式编程”如何看待函数。
在非函数式语言中,我们通常会看到这样的情况:
但事情是这样的:函数式语言使用这种形式,因为您可以创建在非函数式语言中不可能实现的部分函数(无需特别设计)
这意味着所有这些都是该签名的有效函数
在您提供所有必需的参数之前,您将获得由您提供的参数组成的部分函数。