簡體   English   中英

Haskell部分函數應用程序用$

[英]Haskell partial function application with $

我是新來的Haskell和考慮使用功能與應用的一個簡單的例子$

它似乎很簡單 - 它需要一個函數並將其應用於一個值。

所以這是有道理的:

> (+3) $ 2
5

這也是有道理的:

> ($) (+3) 2
5

這是有道理的,因為第一個參數是函數,第二個參數是值。

現在考慮使用$來創建部分函數。

查看類型,這是有道理的 - 它只需要bNum類型值:

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

但是這里我迷路了 - 這里發生了什么?:

> :t ($) (2)
($) (2) :: Num (a -> b) => a -> b

我原以為第一個參數需要是一個函數,而不是一個簡單的Num值。

所以這是我的問題:

  1. 這里發生了什么事?
  2. 約束Num (a -> b)語法是什么意思?
  3. 以這種方式使用($)的例子是什么,從($) (2)

謝謝!

一方面,像2這樣的數字文字實際上被讀作fromInteger 2 :: Num a => a所以可以表示任何類型的值Num a => a ,意思是類型為Num任何類型,即其中fromInteger定義的特殊版本的東西,返回實際類型的實際值,從整數2轉換:

> :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

正如Haskell教程所說(在10.3中),

整數(不帶小數點)實際上等同於fromInteger到數字值作為Integer

另一方面, ($)具有類型

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

所以我們有

fromInteger 2 :: Num a1 =>   a1
($)           ::          (a -> b) -> a -> b
--------------------------------------------
($) 2         :: Num      (a -> b) => a -> b

所以它是一個函數,它也必須類型Num

通常情況並非如此,但Haskell不知道您是否可以導入一些確定此類實例的模塊:

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

因此它允許這種可能性的類型檢查,也只有這樣,看到有定義的任何地方沒有這樣的實際情況下,它的錯誤了這一點

例如,根據評論中@augustss的提示,

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)

讓我們寫(sin + 2 * cos^2) x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM