我看看 Kotlin 的 function type 能怎麼寫好ㄌ
可能是因為能推那個type的compiler好像有點難寫
但是不得不說這其實是 node js 自己不爭氣,他一堆 es6 es7 es8 的相容性都做很糟糕,然後 babel 也越來越複雜,這些問題在 typescript 上面都遇不到,且都相容
我覺得 你只要用了一堆lib這不管哪個語言都無解吧(
你是說 golang 的 dep ensure ㄇ (X
放棄lib 全部輪子自己刻 保證怎麼update你都無感
但是那時候要用 async 不用 ts 會爆炸難維護啊
人家kotlin的non null在runtime也會使non null
人家一堆也在靠杯他沒有 generic type 的也不都還活著好好的
你運算卡住他就卡住了,但是kotlin有coroutine可以用
等等我記得kotlin自己有一套http framework
然後lib用一用用到blocking版本就死到(ry (
不過這是自己要注意的事就是了
喔對kotlin coroutine在1.3有不少break change,建議直接看新版文件
我目前沒有一個舊坑遇到效能問題而且有可能換語言重寫的。
應該不存在吧,畢竟語言是死的,人是活的
是人寫出 Code,所以好不好維護是人的問題吧?
python 的確也不好維護,除非你要把它寫得像 Golang
但寫得像 Golang 就失去 Python 的簡單好寫好使用了
def main():
'''主函數'''
print("Hello, World!")
if __name__ == "__main__":
main()
我覺得你要不要去 Hacker News 或是 Stack Overflow 上問看看啊
如果你這樣說,那感覺這問題會很有趣
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
多此一举的界面,直接给我按passcode就好了么
聽起來跟現存新一代語言有87%像的起頭
有沒有一樣結尾不知道就是了
因為隨便寫都寫的出js
所以就一堆難維護的code (O
規範好沒什麼難維護的
沒規範管他什麼語言
什麼鬼東西都有人寫得出來(
用 Object 接啊,然後弄成 utilities
明明 cast 一下就好,遇到泛型就只能 foreach cast
arr
.map(
(x) => {
return x+1;
}
)
function 要拆開寫,然後 inline function 也要拆,同時還是得縮排
說真的 我不覺得寫三行有什麼不好
一行長到天邊絕對更糟
我要對三個array做map我就要寫3次一樣的code
javascript 也沒有泛型,所以網頁是不是就全都給我滾去用 Rust 了嗎
?????????????????????????
泛型的意義是啥
在有 type system 的情況下做出抽象一點的函數
那你把有 type 的東西全都當作 object 處理不就好了
我就是想用 type system 才不用 js 跟 Py 的啊
然後還要有泛型,只是為了不想要重複寫 code 和寫 utilities
為了不同 type 的 extensions 可以更嚴謹的執行同一個 function 所以在每個不同泛型 type 的同一個 function 都重複寫一樣的 code。
你同一個功能的 function 在不同 type 上面做一樣的事情不是重複的 code 是啥,他唯一差別就只是針對那個 type 有做優化或檢查或轉型之類的不同而已,原則上邏輯不會改變啊
你要用泛型不想寫重複 code 不就是要用在多型嗎
python 3.7 才有 generic type 啊
你一個 map<T>() 進去和一個 map(obj) 進去,其實寫起來是一樣的你知道嗎
obj 能做 static type check?
e.g. if ( typeof(obj) === "int" ) (?
我只是不懂為啥要堅持 generic type 而已
我剛剛用js的寫法所以不能 我想一下用什麼語言你看得懂
要編譯時確認到的話🤔
大概真的不大行
你需要的是編譯時期幫你把所有事都搞定的語言
map 的 type 是這樣ㄉ
map :: (a->b) -> [a] -> [b]
其中 a 跟 b 就是被 generic 的 type
然後我們 apply (+1) 上去 ( (+1) 是 (x) => x+1 的意思)
(+1) 的 type 是 Int -> Int
map (+1)
不過這種東西其實有interface概念的東西也不是很需要就是了
然後我實際上扔了不是那個 type 的東西還是會過,只是 runtime 才會噴掉
於是 (map (+1) ) 變成 [Int] -> [Int}
你故意用 dynamic runtime 丟不是 int 的東西一樣會噴啦
任何語言都可以產生 dynamic runtime
正確來說應該是bytecode compiler (?
啊我除了 TS 和 C# 以外我都刻意避開 generic type 了啊
我完全不覺得 generic type 有多好用,我只有覺得那是在找麻煩
你根本把 generic type 拿來當 static type 來用啊
你剛剛不是這樣問我?
所以我理解成你要用 generic type 就是為了 static type check 不是嗎?
通常要用泛型就是不想要在一件事情裡面一直轉型所以才把型別抽離不是嗎
你認識的泛型到底是哪個
至少我最早認識的JAVA肯定不是這個
因為你不會知道他實際的型別,他是在用的時候才被決定
來 我問你 你用過TS的generic types裡的generic class嗎
沒有的話討論先打住(?
雖然其他的generic類型也一樣
都是編譯時會檢查類型
你建立了一個 generic type 的物件的時候才會檢查啊,但是你在 generic class 裡面的就不見得會被檢查到了,例如你要在裡面用某個 function 然後結果剛好有某個 type 的 interface 缺了,你就會被雷
這事要在compile time就被抓到才對啊???
compile 的時候如果遇到了動態物件就不會檢查到
class X<T impl Compable> {
func test(T a){
this.comp(a);
}
}
以這來說
你的T沒有comp方法在編譯時你的T就被會抓出來了啊
他一樣能用 generic 但是就會 runtime 被雷
我們先假設沒有 dynamic 這種東東
因為這種東東我只在 C# 看過
打一開始就破壞型別規則的東西怎有辦法被編譯器抓出來
不過說實話我覺得沒泛型是還好
很多時候其實用不到
因為真的沒需要那麼generic
問題點就是沒有 map filter fold 跟其他一堆函數能用啊
我要做三個list的map
每個List的type都不一樣
啊如果不會,那你這樣不就丟了一個會型別錯誤的東西了嗎
arr2 = [x+5 for x in arr1]
其中的 Higher Order Functiuon
你可以寫
for (const i of ints) int2s.push(i+1)
假設我今天要直接使用沒有要用一個 int2s 變數來存ㄋ
啊 沒有map函數可以有list comp語法糖啊
問題在哪
覺得golang不行就別用也是沒啥 反正也不是人人都愛(
繼續來安利crystal (X
雖然我最近好像都在寫js 🌚
你是說 list comprehension 嗎?
你上面說的兩個東西,前者官方說有,但我不認為他算有,後者本來就不可能實現
我是覺得有foreach
沒map也沒啥大問題啦
當然很要求我也無法(
而且說實話
map reduce filter是functional來的吧
golang打一開始就沒啥藥functional的意思
有人回golang然後被reject啊
痾 那個人來著 有這人嗎(X
泛型沒啥不好啊
不過也不是必要
但要說缺點也只有寫compiler的人會想死(O
swift只有macos跟linux的compiler
而且linux版本的compiler還只有Ubuntu版
我覺得在 Windows 上面不用微軟派的語言根本就找死 (#
swift的compiler本身也有開源,你要把他對Debian或是啥重編都可以
Apple的東西一向以對他自己生態系以外的東西不友善聞名的啊
這根screen vs tmux
vim vs emacs
tab vs N spaces
一樣
根本是宗教之爭(?
你在開始和我戰泛型之前就回答到了啊....但是我還是不懂為啥後面會戰起來( ・᷄ὢ・᷅ )
還剛好蓋掉return address導致話題往完全無關的方向討論嗎?
用 generic type vs. 用 golang 寫 func 來做你要做的事情 (?
我本來就知道泛型是啥啊...我只是不懂你為啥堅持要這樣用而已...Orz
泛型有兩種實作吧,一種是java那種,一種是c++模板那樣他媽的全部展開
你同一個功能的 function 在不同 type 上面做一樣的事情不是重複的 code 是啥,他唯一差別就只是針對那個 type 有做優化或檢查或轉型之類的不同而已,原則上邏輯不會改變啊
為了不同 type 的 extensions 可以更嚴謹的執行同一個 function 所以在每個不同泛型 type 的同一個 function 都重複寫一樣的 code。
但論結果上都維持了靜態型別啊
錯誤回報的問題先丟一旁
但是kotlin支援c++那種模板歐,他的inline function就是真的直接展開
不過.NET黑魔法太多了啥都不意外
C/C++可能還比較單純(?
我的這句話主要是在說你在寫 generic type 的時候他這時候不會檢查,因為你還沒開始用所以他沒辦法檢查,所以即使你要用一個原則上通通都支援的 toString() 也可能會遇到無法用的狀況的意思
說起來js裡的promise factory function一般名稱好像沒啥特別不同?
Android x86-64, which makes me wanna die.
我覺得這概念就像我們要畢業時正好學校要換書包,於是我們就全部投票給最醜的那個
然後 慘 醜爆了 學弟妹崩潰
我還沒想出同時可以給110跟220的四孔插座長怎樣
然後台電用的是 110v 跟 -110v 所以沒有比較危險
orig 是個指針,*orig 是 orig 的 Type
話說你覺得我應該自組 NAS 還是買台 NAS 比較好(
還是統一用冷氣插座而且最好顏色區分做防呆(不防蠢)設計
而且這種孔,有國家的220V電器使用這種規格嗎 ?
這樣聽起來一樣要另造電器無法直接拿200V的電器來連接 ?
但是相與相之間的 220V 是不能直接兼容普通的 220V 電器
啊如果你只拿220v損耗就會減少啊
當然因為還是為了兼容提供110就沒差異是真的
先說220是相間RMS還是各相對地
前者可以用沒問題啊
真的改插頭別說110電器不能用
220電器也不能用
整個換更大
傻了才這樣搞吧
再說現有110/220系統只要110v兩相平衡的話
耗損明明也沒純220大啊🤔
你還有一個能修的,如果英文夠好,你可以開一堆PR修正英文翻譯
我之前fork過了 我要怎麼把新的commit拉過來
git add upstream [捲斯repo的url]
git fetch upstream/master
git reser --hard upstream/master
這樣如果第一個就符合了 他還是會繼續 match 後面的
我連 Array.prototype.every 也不知道是什麼
既然要改,為什麼不讓他有一個是false就return
喔喔 every 只要有一個 false 就會 return false
for (let ignore of ignore) {
if (nick.match(new RegExp(ignore, 'gi'))) return false
}
return true
for of 就是 array 裡每一個,沒有歧義
用了 Array.prototype.every 就清楚的表達了對於每個元素
這段很明顯阿,你拿去問每一個人,我相信正常人都會說直接for of好看懂
而且js用every比直接for of起碼慢幾十唄...
只是為了好看懂,但在這種連看懂都不容易的情況下沒用的意義
functional 很棒,但為了 functional 而 functional沒有意義
你用了很好的語法,但你把排版整個弄爛到沒人看得懂阿
這也說明了我的用意不是單純縮短他 而是增加可讀性阿
const checkIgnore =
nick =>
ignore.every(
x => ! nick.match(new RegExp(x, gi))
)
好好好你寫的比較可讀
這不能讓你上述的不實指控合理化阿
functional 很棒,但為了 functional 而 functional 沒有意義
你寫的那個有辦法對應到這function的原意嗎?
isNotIgnored
!ignored.some(
(x)=>nick.match(new RegExp(x, gi))
)
可能我在撰寫技巧上有問題 但這不代表你可以隨便曲解我的原意阿
而且把function壓成一坨塞在同一行,我也無法接受阿
是說為啥捲私會寫出一個意思是沒被忽略的function
我覺得,如果你連自己在寫啥都不清楚就上functional...那就真的只是想functional阿
我的原意就只是我在 GitHub 上看那串code看很久,發現就只是單純every的概念而已財改的
把 checkIgnore 改成 shouldPass 搞不好好一點
我指出 forEach 是回復你前面關於效能的問題
光從命名我看不出他是該被忽略還是不該被忽略得意思...