Haskell: "Cast" / 强制类型转换?

6

我该如何让Haskell将某些内容解释为特定类型呢? 举个例子,我有一个列表,想要将其长度除以2。 那么我可以这样写:

(length mylist) / 2

并得到以下错误:

使用`/'时,没有实例(Fractional Int)

由于我想要整数除法,所以我想让length mylist2和结果Int


顺便提一下,在Data.List中有一个名为genericLength的函数。在您的情况下,它可能不会返回整数答案,但通常很有用,因为它可以避免一些尴尬的fromIntegral调用。 - Matvey Aksenov
需要更多的 fromIntegral。但说真的,fromIntegral 是将 Int “转换”为任何实例化了 Num 类型类的神奇方式。 - Dan Burton
2个回答

11

这里有两个不同的问题。

  • 整数除法:使用div函数:div(length mylist) 2或者(length mylist) `div` 2

  • 类型转换。可以通过写expression :: type来告诉Haskell一个特定表达式的类型,而不是仅仅写expression。然而,这并不会对值进行“转换”或“转型”。一些有用的函数用于在各种数字和字符串类型之间进行转换,包括fromIntegralshowreadrealToFracfromRationaltoRationaltoInteger等。你可以在Hoogle上查找这些函数。


5
尝试使用 div (length my list) 2/ 表示分数除法,div 则表示整数除法。

啊,谢谢。 那一般怎么做呢? 你总是需要坚持函数类型定义吗? - user905686
有一些函数可以让你将一个类型转换为另一个类型(例如将整数转换为分数),但是是的,Haskell 的本质是如果类型不符合函数的定义,你 得到一个错误。 - mipadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接