簡體   English   中英

Haskell部分應用程序似乎無法使用。 為什么?

[英]Haskell partial application doesn't seem to work with on. Why?

局部使用單個其他函數似乎可以更改所涉及的類型。

從比較長度“ aaa”,“ bb”開始,然后從右側剝離項目,事情開始時就可以預測:

Prelude Data.Function> :t on compare length "aaa" "bb"
on compare length "aaa" "bb" :: Ordering

Prelude Data.Function> on compare length "aaa" "bb"
GT


Prelude Data.Function> :t on compare length "aaa"
on compare length "aaa" :: [Char] -> Ordering

Prelude Data.Function> let ocla = on compare length "aaa"

Prelude Data.Function> :t ocla
ocla :: [Char] -> Ordering

Prelude Data.Function> ocla "aa"
GT


Prelude Data.Function> :t on compare length
on compare length :: [a] -> [a] -> Ordering

Prelude Data.Function> let ocl = on compare length

Prelude Data.Function> :t ocl
ocl :: [a] -> [a] -> Ordering

Prelude Data.Function> ocl "aaa" "aa"
GT

但是相比之下,我感到驚訝:

Prelude Data.Function> :t on compare
on compare :: Ord b => (a -> b) -> a -> a -> Ordering

Prelude Data.Function> let oc = on compare

Prelude Data.Function> :t oc
oc :: (a -> ()) -> a -> a -> Ordering

Prelude Data.Function> oc length "aaa" "aa"

<interactive>:27:4:
    Couldn't match type `Int' with `()'
    Expected type: [Char] -> ()
      Actual type: [Char] -> Int
    In the first argument of `oc', namely `length'
    In the expression: oc length "aaa" "aa"
    In an equation for `it': it = oc length "aaa" "aa"

為什么oc的類型與on compare的類型不同?

這是由於可怕的單態性限制。 GHCi使用Monomorphism限制來猜測在交互模式下定義的函數或值的最簡單類型。 這通常是非常有用的,但是在您確實需要類型類約束類型的地方(例如Ord a => a () ,它常常是笨拙的() 只要為您的oc函數提供類型簽名,就可以了:

let oc :: Ord b => (a -> b) -> a -> a -> Ordering; oc = on compare

如果想使用:set -XNoMonomorphismRestriction (感謝@Xeo),可以關閉Monomorphism限制,但我建議您反對。 您可以將函數放入文件中並將其加載到GHCi中,或者以交互方式添加類型簽名。


維基文章( http://www.haskell.org/haskellwiki/Monomorphism_restriction)更詳細地說明了此問題。

暫無
暫無

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

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