我是Haskell的新手,正在研究一个将函数应用程序与$
一起使用的简单示例。
这似乎很简单-它接受一个函数并将其应用于值。
所以这很有意义:
> (+3) $ 2
5
这也很有意义:
> ($) (+3) 2
5
这很有意义,因为第一个参数是函数,第二个参数是值。
现在考虑使用$
创建部分函数。
看看类型,这很有意义-它只需要Num
的{{1}}类型值:
b
但是这里是我迷路的地方-这里发生了什么?
> :t ($) (+3)
($) (+3) :: Num b => b -> b
我希望第一个参数需要是一个函数,而不是简单的Num值。
这是我的问题:
> :t ($) (2)
($) (2) :: Num (a -> b) => a -> b
的语法是什么意思?Num (a -> b)
并从($)
开始的例子是什么?谢谢!
答案 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)
。