為什么這個函式需要一個整數串列?
Prelude> :t \xs->[(map $ uncurry(*)) (zip xs [1..n]) | n<-[1..(length xs)]]
\xs->[(map $ uncurry(*)) (zip xs [1..n]) | n<-[1..(length xs)]]
:: [Int] -> [[Int]]
當我length xs用固定值替換時,型別會發生變化并且不再那么嚴格:
Prelude> :t \xs->[(map $ uncurry(*)) (zip xs [1..n]) | n<-[1..100]]
\xs->[(map $ uncurry(*)) (zip xs [1..n]) | n<-[1..100]]
:: (Num b, Enum b) => [b] -> [[b]]
我的編譯器是
$ ghci --version
The Glorious Glasgow Haskell Compilation System, version 8.8.4
uj5u.com熱心網友回復:
length有 type Foldable t => t a -> Int,這意味著length xs特別是一個Int值。這使得[1..(length xs)]成為 type[Int]等。
100,在另一方面,是不一個Int字面,但型別的多型型文字Num a => a。這使得[1..100]有型別Num a => [a]等。
也就是說,length是唯一像Int最終型別那樣強制使用具體型別的東西。將其替換為更通用的100,最終型別也更通用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389025.html
上一篇:Java入門到架構師教程之JavaScript:history物件和location物件、JavaScript設計模式系統講解與應用
