Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell是替换字符串中的字符的更好方法_List_Haskell - Fatal编程技术网

List Haskell是替换字符串中的字符的更好方法

List Haskell是替换字符串中的字符的更好方法,list,haskell,List,Haskell,我做了这个函数 replace :: Char -> Char -> [Char] -> [Char] replace _ _ [] = [] replace a b (c:r) | a == c = b : replace a b r | otherwise = c : replace a b r foo :: A -> B -> B foo x y = y 当我发现这一点时,我正在寻找一种更好的写作方式: replace :: Char -&

我做了这个函数

replace :: Char -> Char -> [Char] -> [Char]
replace _ _ [] = []
replace a b (c:r)
    | a == c = b : replace a b r
    | otherwise = c : replace a b r
foo :: A -> B -> B
foo x y = y
当我发现这一点时,我正在寻找一种更好的写作方式:

replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map $ \c -> if c == a then b else c

甚至没有写第三个参数,我不理解$和\c符号,但它起作用了,我想知道这里发生了什么

甚至连第三个论点都没有写出来

在Haskell中,所有函数只有一个参数。事实上,Char->Char->[Char]->[Char]是Char->Char->[Char]->[Char]的缩写,因此它是一个接受一个Char然后返回另一个函数的函数。如果我们用另一个字符应用该函数,它将返回一个[Char]->[Char]类型的函数,该函数将把一个字符列表映射到一个字符列表,最后如果我们用一个字符列表调用该函数,我们将得到一个字符列表

因此,这意味着如果函数头中有两个参数,那么map$\c->if c==a,那么b else c应该返回一个函数,情况就是这样

…我不懂$…符号

该功能定义为:

infixr 0 $

($) :: (a -> b) -> a -> b
($) f x = f x
因此,它是函数应用。之所以使用它,是因为它的优先级为0,这意味着,例如$Bx将作为Bx计算,而Bx将作为Bx计算。因此,这意味着该函数等价于map\c->如果c==a,那么b else c

我不明白…这些符号

这是一个lambda表达式。它是一个函数,将变量c作为输入,并将其映射到箭头->右侧的零件上。这里它意味着如果c==a,它将字符c映射到b;否则返回c

甚至连第三个论点都没有写出来

在Haskell中,所有函数只有一个参数。事实上,Char->Char->[Char]->[Char]是Char->Char->[Char]->[Char]的缩写,因此它是一个接受一个Char然后返回另一个函数的函数。如果我们用另一个字符应用该函数,它将返回一个[Char]->[Char]类型的函数,该函数将把一个字符列表映射到一个字符列表,最后如果我们用一个字符列表调用该函数,我们将得到一个字符列表

因此,这意味着如果函数头中有两个参数,那么map$\c->if c==a,那么b else c应该返回一个函数,情况就是这样

…我不懂$…符号

该功能定义为:

infixr 0 $

($) :: (a -> b) -> a -> b
($) f x = f x
因此,它是函数应用。之所以使用它,是因为它的优先级为0,这意味着,例如$Bx将作为Bx计算,而Bx将作为Bx计算。因此,这意味着该函数等价于map\c->如果c==a,那么b else c

我不明白…这些符号

这是一个lambda表达式。它是一个函数,将变量c作为输入,并将其映射到箭头->右侧的零件上。这里它意味着如果c==a,它将字符c映射到b;否则它将返回c。

美元运算符将函数应用于参数。我们可以将您的示例改写为

replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map (\c -> if c == a then b else c)
实际上,Haskeller经常使用$来避免使用括号。由于其他原因,它很少被使用

关于\c->…:这是一个匿名函数,也称为lambda。它代表以c为参数并返回。。。部分在您的例子中,函数接受c并检查它是否等于a,在这种情况下返回b,否则返回c。我们可以在没有lambda的情况下重写代码,如下所示:

replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun = \c -> if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b xs = map myFun xs
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
或者,将参数c移到=,如下所示:

replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun = \c -> if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b xs = map myFun xs
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
关于缺少的第三个参数:可以通过多种方式读取类型Char->Char->[Char]->[Char]:

接受一个参数Char并返回函数Char->[Char]->[Char]的函数类型 采用两个参数Char和Char并返回函数[Char]->[Char]的函数类型 采用三个参数Char、Char和[Char]并返回列表[Char]的函数类型 多亏了咖喱,这三种解释都是相容的。事实上,这两个参数起作用

replace :: Char -> Char -> [Char] -> [Char]
replace _ _ [] = []
replace a b (c:r)
    | a == c = b : replace a b r
    | otherwise = c : replace a b r
foo :: A -> B -> B
foo x y = y
以及功能

foo :: A -> B -> B
foo x = id              -- id is the identity function B -> B
都是一样的

在您的示例中,如果需要,可以将缺少的参数添加到=的两侧,如下所示:

replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun = \c -> if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b xs = map myFun xs
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
在这个扩展代码中,您可以看到map myFun xs使用map库函数将myFun应用于list xs的所有元素,并返回所有结果的列表。 这有效地实现了您想要的替换

但是,在不增加第三个论点的情况下,

replace :: Char -> Char -> [Char] -> [Char]
replace a b = map myFun
   where ...
我们仍然可以将map myFun解释为将函数myFun::Char->Char转换为函数[Char]->[Char]。如果我们将其解释为一个双参数函数,则后者实际上是replace的返回类型。也就是说,replace'a''b'是函数[Char]->[Char],它接受一个字符串并用一个'b'替换其中的每个'a'。

美元运算符将函数应用于参数。我们可以将您的示例改写为

replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map (\c -> if c == a then b else c)
实际上,Haskeller经常使用$来避免使用括号。是r 它们被用于其他原因

关于\c->…:这是一个匿名函数,也称为lambda。它代表以c为参数并返回。。。部分在您的例子中,函数接受c并检查它是否等于a,在这种情况下返回b,否则返回c。我们可以在没有lambda的情况下重写代码,如下所示:

replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun = \c -> if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b xs = map myFun xs
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
或者,将参数c移到=,如下所示:

replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun = \c -> if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b xs = map myFun xs
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
关于缺少的第三个参数:可以通过多种方式读取类型Char->Char->[Char]->[Char]:

接受一个参数Char并返回函数Char->[Char]->[Char]的函数类型 采用两个参数Char和Char并返回函数[Char]->[Char]的函数类型 采用三个参数Char、Char和[Char]并返回列表[Char]的函数类型 多亏了咖喱,这三种解释都是相容的。事实上,这两个参数起作用

replace :: Char -> Char -> [Char] -> [Char]
replace _ _ [] = []
replace a b (c:r)
    | a == c = b : replace a b r
    | otherwise = c : replace a b r
foo :: A -> B -> B
foo x y = y
以及功能

foo :: A -> B -> B
foo x = id              -- id is the identity function B -> B
都是一样的

在您的示例中,如果需要,可以将缺少的参数添加到=的两侧,如下所示:

replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun = \c -> if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b  = map myFun
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
replace :: Char -> Char -> [Char] -> [Char]
replace a b xs = map myFun xs
   where
   myFun :: Char -> Char
   myFun c = if c == a then b else c
在这个扩展代码中,您可以看到map myFun xs使用map库函数将myFun应用于list xs的所有元素,并返回所有结果的列表。 这有效地实现了您想要的替换

但是,在不增加第三个论点的情况下,

replace :: Char -> Char -> [Char] -> [Char]
replace a b = map myFun
   where ...
我们仍然可以将map myFun解释为将函数myFun::Char->Char转换为函数[Char]->[Char]。如果我们将其解释为一个双参数函数,则后者实际上是replace的返回类型。也就是说,replace'a''b'是函数[Char]->[Char],它接受一个字符串并用一个'b'替换其中的每个'a'