具有$

时间:2019-02-02 08:02:04

标签: haskell types polymorphism partial-application parametric-polymorphism

我是Haskell的新手,正在研究一个将函数应用程序与$一起使用的简单示例。

这似乎很简单-它接受一个函数并将其应用于值。

所以这很有意义:

> (+3) $ 2
5

这也很有意义:

> ($) (+3) 2
5

这很有意义,因为第一个参数是函数,第二个参数是值。

现在考虑使用$创建部分函数。

看看类型,这很有意义-它只需要Num的{​​{1}}类型值:

b

但是这里是我迷路的地方-这里发生了什么?

> :t ($) (+3)
($) (+3) :: Num b => b -> b

我希望第一个参数需要是一个函数,而不是简单的Num值。

这是我的问题:

  1. 这里发生了什么?
  2. 约束> :t ($) (2) ($) (2) :: Num (a -> b) => a -> b 的语法是什么意思?
  3. 以这种方式使用Num (a -> b)并从($)开始的例子是什么?

谢谢!

1 个答案:

答案 0 :(得分:9)

一方面,像 using System.Collections; using System.Collections.Generic; using UnityEngine; public class waitthendosomthing : MonoBehaviour { public bool beingHandled = true; // bool void Update() { //transform.Rotate(6, 0, 0);// this runs if (beingHandled == true ) { StartCoroutine(HandleIt());// run function } } void rotateit() { transform.Rotate(6, 0, 0);// this dosnt run print("running this function"); } IEnumerator HandleIt() { beingHandled = false; print("BeingHandled is off"); rotateit(); //transform.Rotate(6, 0, 0); // or this yield return new WaitForSeconds(3.1f); //transform.Rotate(0, 0, 0); // or this yield return new WaitForSeconds(3.1f); beingHandled = true; print("BeingHandled is on"); } } 这样的数字文字实际上被读为2,因此可以表示类型为fromInteger 2 :: Num a => a的任何值,表示任何类型为类型类Num a => a,即具有Num的特殊版本,该版本定义了从整数fromInteger转换而来的实际类型的实际值:

2

the Haskell Tutorial所述(在10.3中),

  

整数(不带小数点)实际上等效于将> :i Num class Num a where (+) :: a -> a -> a (*) :: a -> a -> a (-) :: a -> a -> a negate :: a -> a abs :: a -> a signum :: a -> a fromInteger :: Integer -> a 应用于作为fromInteger的数字的值。

另一方面,Integer的类型

($)

所以我们有

> :t ($)
($) :: (a -> b) -> a -> b

所以它是一个函数,在类fromInteger 2 :: Num a1 => a1 ($) :: (a -> b) -> a -> b -------------------------------------------- ($) 2 :: Num (a -> b) => a -> b 中也必须是

通常不是这种情况,但是Haskell不知道您是否可以导入确实定义了此类实例的某个模块:

Num

因此它允许在类型检查中实现这种可能性,只有到那时,看到在任何地方都没有定义这样的实际实例,它会在那个上出错。

例如,以下从提示@augustss中的注释

instance Num (a -> b) where
   ....
   fromInteger n = ....
   ....

让我们写instance (Num b) => Num (a -> b) where (+) f g x = f x + g x (*) f g x = f x * g x abs f x = abs (f x) negate f x = negate (f x) signum f x = signum (f x) fromInteger n = const (fromInteger n)