2012-02-19 75 views
4

例如,我有以下功能:“去哪儿”的功能类型在Haskell

foo :: t -> f 
foo var = foo' b var 
    where 
     b = bar 0.5 vect 

,我需要指定文字0.5型 - ‘T’

如果我写了不便。如(0.5::t),GHC创建新的类型变量't0',它与原始't'不相对应。

我已经写了一个小功能

ct :: v -> v -> v 
ct _ u = u 

,并使用它像这样:

b = bar (ct var 0.5) d 

有没有更好的解决办法?

+0

有一个编译器选项,可以让你说'(0.5 :: T)'和它会将't'与周围的示波器的't'相匹配,但我忘记了它是什么。 – 2012-02-19 21:41:28

+1

你写了很少的信息 - 例如什么是酒吧分别酒吧的类型签名和foo'以及。据我了解,小写字母是ghc被推断的占位符。已知类型以大写字母“Float”或“Int”开头,因此您几乎不会将类型信息传递给需要更多信息的编译器。 – epsilonhalbe 2012-02-19 21:48:32

+0

如果您尝试使用'ghci'加载文件,解释器仍会失败 - 因为我记得它不那么严格。此外,您可以通过':t foo'找出函数的类型。 – epsilonhalbe 2012-02-19 21:52:00

回答

8

您可以使用ScopedTypeVariables从顶级签名改成范围带来的类型变量,

{-# LANGUAGE ScopedTypeVariables #-} 

foo :: forall t. Fractional t => t -> f 
foo var = foo' b var 
    where 
    b = bar (0.5 :: t) vect 

您的辅助函数ct是 - 与翻转参数 - 已经在前奏,

ct = flip asTypeOf 

so

where 
    b = bar (0.5 `asTypeOf` var) vect 

也可以工作。

+0

谢谢,我正是需要的! – 2012-02-20 09:36:31

1

如果没有ScopedTypeVariables,通常的解决方案是将b重写为一个函数,使其采用t类型并返回包含t类型的内容。这样,其t是通用的,并且独立于外部t,并且可以基于它的使用位置来推断。

然而,在不知道类型的foo'bar等的,我不能告诉你它看起来什么样