第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在Haskell中定義Lisp的應(yīng)用?

如何在Haskell中定義Lisp的應(yīng)用?

如何在Haskell中定義Lisp的應(yīng)用?不應(yīng)該像Haskell這樣的惰性語言允許這個(gè)定義,其中函數(shù)是curry?apply f [] = f apply f (x:xs) = apply (f x) xs它基本上是一個(gè)將給定函數(shù)應(yīng)用于給定參數(shù)列表的函數(shù),并且很容易在Lisp中完成。有沒有解決方法?
查看完整描述

3 回答

?
大話西游666

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊

很難給apply函數(shù)賦一個(gè)靜態(tài)類型,因?yàn)樗念愋腿Q于(可能是異構(gòu)的)list參數(shù)的類型。在Haskell中編寫此函數(shù)的方法至少有兩種我能想到的方法:

用反射

我們可以推遲應(yīng)用程序的類型檢查直到運(yùn)行時(shí):

import Data.Dynamicimport Data.Typeable

apply :: Dynamic -> [Dynamic] -> Dynamic
apply f []      = f
apply f (x:xs)  = apply (f `dynApp` x) xs

請(qǐng)注意,現(xiàn)在Haskell程序可能會(huì)在運(yùn)行時(shí)因類型錯(cuò)誤而失敗。

編輯:我無法想出一種方法來編寫它,而不使用動(dòng)態(tài)類型或hlists /存在。很想看到一個(gè)例子


查看完整回答
反對(duì) 回復(fù) 2019-08-28
?
至尊寶的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊

我喜歡Sjoerd Visscher的回復(fù),但擴(kuò)展 - 特別是IncoherentInstances在這種情況下用于部分應(yīng)用的擴(kuò)展- 可能有點(diǎn)令人生畏。這是一個(gè)不需要任何擴(kuò)展的解決方案。

首先,我們定義一個(gè)函數(shù)的數(shù)據(jù)類型,知道如何處理任意數(shù)量的參數(shù)。你應(yīng)該a在這里讀作“參數(shù)類型”,并b作為“返回類型”。

data ListF a b = Cons b (ListF a (a -> b))

然后我們可以編寫一些(Haskell)函數(shù)來實(shí)現(xiàn)這些(可變參數(shù))函數(shù)。我將F后綴用于恰好在Prelude中的任何函數(shù)。

headF :: ListF a b -> b
headF (Cons b _) = b

mapF :: (b -> c) -> ListF a b -> ListF a c
mapF f (Cons v fs) = Cons (f v) (mapF (f.) fs)partialApply :: ListF a b -> [a] -> ListF a b
partialApply fs          []     = fs
partialApply (Cons f fs) (x:xs) = partialApply (mapF ($x) fs) xs

apply :: ListF a b -> [a] -> b
apply f xs = headF (partialApply f xs)

例如,該sum函數(shù)可以被認(rèn)為是一個(gè)可變函數(shù):

sumF :: Num a => ListF a a
sumF = Cons 0 (mapF (+) sumF)sumExample = apply sumF [3, 4, 5]

但是,我們還希望能夠處理正常的函數(shù),這些函數(shù)不一定知道如何處理任何數(shù)量的參數(shù)。那么該怎么辦?好吧,就像Lisp一樣,我們可以在運(yùn)行時(shí)拋出異常。下面,我們將使用f非可變函數(shù)的簡(jiǎn)單示例。

f True True True  = 32f True True False = 67f _ _ _ = 9tooMany = error "too many arguments"tooFew  = error "too few arguments"lift0 v = Cons v tooMany
lift1 f = Cons tooFew (lift0 f)lift2 f = Cons tooFew (lift1 f)lift3 f = Cons tooFew (lift2 f)fF1 = lift3 f

fExample1 = apply fF1 [True, True, True]fExample2 = apply fF1 [True, False]fExample3 = apply (partialApply fF1 [True, False]) [False]

當(dāng)然,如果你不喜歡定義的樣板lift0lift1,lift2lift3,等分開,那么你就需要啟用一些擴(kuò)展。但是如果沒有他們,你可以走得很遠(yuǎn)!

以下是如何推廣到單個(gè)lift函數(shù)的方法。首先,我們定義一些標(biāo)準(zhǔn)的類型級(jí)數(shù):

{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, TypeFamilies, UndecidableInstances #-}data Z = Znewtype S n = S n

然后介紹用于提升的類型類。您應(yīng)該將類型讀I n a b作“ 作為參數(shù)的n副本a,然后返回類型b”。

class Lift n a b where
    type I n a b :: *
    lift :: n -> I n a b -> ListF a binstance Lift Z a b where
    type I Z a b = b
    lift _ b = Cons b tooManyinstance (Lift n a (a -> b), I n a (a -> b) ~ (a -> I n a b)) => Lift (S n) a b where
    type I (S n) a b = a -> I n a b
    lift (S n) f = Cons tooFew (lift n f)

以下是使用f之前使用廣義電梯重寫的示例:

fF2 = lift (S (S (S Z))) f

fExample4 = apply fF2 [True, True, True]fExample5 = apply fF2 [True, False]fExample6 = apply (partialApply fF2 [True, False]) [False]


查看完整回答
反對(duì) 回復(fù) 2019-08-28
?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊

不,它不能。f并且f x是不同的類型。由于haskell的靜態(tài)類型性質(zhì),它不能承擔(dān)任何功能。它必須采用特定類型的功能。

假設(shè)f傳入類型a -> b -> c。然后f x有類型b -> c。但a -> b -> c必須具有相同的類型a -> b。因此,類型的函數(shù)a -> (b -> c)必須是類型的函數(shù)a -> b。所以b必須是相同的b -> c,這是一種無限類型b -> b -> b -> ... -> c。它不可能存在。(繼續(xù)替代b -> cb


查看完整回答
反對(duì) 回復(fù) 2019-08-28
  • 3 回答
  • 0 關(guān)注
  • 699 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)